簡單的貪心,最初先把每個需要覆蓋的點分別覆蓋,這時候所需的東東一般會超過給你的東東。
超過多少呢?假設(shè)為n吧,這個樣你需要選擇n個空白檔(即已經(jīng)覆蓋的兩個牛棚間的空白牛棚)
也把他們覆蓋掉,這樣每覆蓋 一個,n就能減少1,直到n=0就算完成任務(wù)。
之所以是貪心,因為我們在選擇那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