简单的贪心策略,想想在生活中让你去挡拿板子去当牛棚的话,你肯定不会去挡空隙太大,也就是根本没有牛在牛棚里的牛舍,那么这样以来再分析一下,如果你可以买M块板子,那么肯定是使用尽量多的板子,因为多用板子不会比少用的情况差可能会更好,因为这样避免了浪费(挡了一些空的牛舍)。那么这样思路就明显了,要用M块板子去挡牛棚,要求板子的总长度和尽量小,那么就是尽量不要去挡空隙太大的,也就是找出空闲牛棚间隙最大的前m-1个,减掉他们的长度便可以得到答案。忘了有个坑的地方是,如果M》C的话完全可以用一个办挡住一个牛棚位置,所以此时答案直接输出C,上面的策略就行不通了,做一下特判就好了。
/*
ID: ljracm1
LANG: C++
PROB: barn1
*/
#include<iostream>
#include<algorithm>
#include<cstdio>
#define T
using namespace std;
struct Item{
int l,r,dis;
};
bool cmp(Item A,Item B){
return A.dis>B.dis;
}
int main(){
#ifdef T
freopen("barn1.in","r",stdin);
freopen("barn1.out","w",stdout);
#endif
int m,c,s;
while(cin>>m>>s>>c){
int *stall = new int[c+5];
for(int i=0; i<c; i++)
cin>>stall[i];
sort(stall,stall+c);
if(m>=c){
cout<<c<<endl;
continue;
}
Item *tem = new Item[c+2];
for(int i=0; i<c-1; i++){
tem[i].l=stall[i];
tem[i].r=stall[i+1];
tem[i].dis=tem[i].r-tem[i].l+1;
}
sort(tem,tem+c-1,cmp);
int ans = stall[c-1]-stall[0]+1;
for(int i=0; i<m-1; i++)
ans -= tem[i].dis-2;
cout<<ans<<endl;
delete []stall;
delete []tem;
}
return 0;
}