这题是我们学校从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}