Barn Repair---贪心算法


这题是我们学校从USACO盗的,正所谓洋为我用。
还有就是我发现C++博客挺快的,比其它网快多了。

算法:
1,首先把两头没牛的删去,这样所有有牛的都在i,j的范围内
2,计算间隔的个数cnt_val并按大小排序,牛群的个数cnt_cows等于间隔个数加1,所谓牛群就是一片一片的牛的个数,比如5 6 7三个都有牛,算一个群
3,比较,如果牛群个数小于m,直接输出牛的个数(不是牛群)
    如果牛群大于M
        {length=j-i+i;(整个范围)
     首先,用一快木板把所有的牛都覆盖了
    * 如果木板有剩余,加一块木板,然后length减去最大的间隔;
    *共执行m-1次
}
题目地址:
http://icpc.ahu.edu.cn/AOJ/showproblem?problem_id=1187
    代码:
 1#include<iostream>
 2#include<algorithm>
 3#include<vector>
 4#include<string.h>
 5using namespace std;
 6int main()
 7{
 8    int a[205];
 9    int b[205];
10    memset(b,0,205*sizeof(int));
11    memset(a,0,205*sizeof(int));
12    int i, m,s,c,ival,j,length,cnt_cows,cnt_val,cnt,p;
13    cin>>m>>s>>c;
14        for(i=1;i<=c;i++)//下标从1开始
15    {
16        cin>>ival;
17        a[ival]=1;
18    }
19    i=1;
20    while(a[i]==0)
21        i++;//牛的起始下标
22    j=s;
23    while(a[j]==0)
24        j--;//牛的终止下标
25    p=1;
26    for(int k=i+1;k<=j;)
27    {
28        cnt=0;
29        if(a[k]==1)
30            k++;
31        if(a[k]==0&&a[k-1]==1&&k<=j)
32        {
33            while(a[k]==0)
34            {cnt++;k++;}
35            if(cnt!=0)
36                b[p++]=cnt;
37        }
38    }
39    p=p-1;//p为间隔数
40    cnt_val=p;
41    cnt_cows=cnt_val+1;
42    sort(b+1,b+1+p);
43    length=j-i+1;
44    if(cnt_cows<=m)
45        cout<<c<<endl;
46    else 
47    {
48        for(int q=1;q<=m-1;++q)
49            length-=b[p--];
50        cout<<length<<endl;
51    }
52
53    return 0;
54}

posted on 2010-03-28 23:03 田兵 阅读(116) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

导航

统计

常用链接

留言簿(2)

随笔分类(65)

随笔档案(65)

文章档案(2)

ACM

搜索

积分与排名

最新随笔

最新评论

阅读排行榜