简单的贪心,最初先把每个需要覆盖的点分别覆盖,这时候所需的东东一般会超过给你的东东。
超过多少呢?假设为n吧,这个样你需要选择n个空白档(即已经覆盖的两个牛棚间的空白牛棚)
也把他们覆盖掉,这样每覆盖 一个,n就能减少1,直到n=0就算完成任务。
之所以是贪心,因为我们在选择那n个空白档的时候是从小到大选的。
同样的,也可以用hash的思想精简代码。
1 /*
2 ID : 31440461
3 PROG : barn1
4 LANG : C++
5 */
6 #include <iostream>
7 using namespace std;
8 const int MAXS=200+10;
9
10 int main()
11 {
12 freopen("barn1.in","r",stdin);
13 freopen("barn1.out","w",stdout);
14 int m,s,c;
15 cin >> m >> s >> c;
16 bool a[MAXS];
17 memset(a,0,sizeof(a));
18 int x;
19 for (int i=0;i<c;i++) cin >> x, a[x]=1;
20 int cou[MAXS];
21 memset(cou,0,sizeof(cou));
22 x=1;
23 while (!a[x]) x++;
24 for (int i=x+1;i<MAXS;i++)
25 if (a[i]) ++cou[i-x-1], x=i;
26 if (m>=c) { cout << c << endl;return 0;}
27 x=c-m;
28 int ans=0;
29 for (int i=0;i<MAXS;i++)
30 {
31 x-=cou[i];
32 ans+=i*cou[i];
33 if (x<=0) {ans-=(-x)*i;break;}
34 }
35 cout << ans+c << endl;
36 return 0;
37 }
38
39
40
41