题目请点我
题解:
简单贪心,先全部覆盖上,然后去掉两头,之后每次去掉一个最大的间隙。
代码实现:
/*
ID: eashion
LANG: C++
TASK: barn1
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#define MAX_S 210
#define MAX_M 55
using namespace std;
int res;
int num;
int M,S,C;
int pos[MAX_S];
int blos[MAX_M];
bool cmp(const int a, const int b){
return a > b;
}
int main()
{
freopen("barn1.in","r",stdin);
freopen("barn1.out","w",stdout);
while( scanf("%d%d%d",&M,&S,&C) != EOF ){
res = S;
num = 0;
memset(pos,0,sizeof(pos));
for( int i = 0; i < C; i++ ){
int a;
scanf("%d",&a);
pos[a] = 1;
}
int ps = 1;
while( pos[ps] == 0 ){
pos[ps] = 1;
ps++;
}
res -= (ps-1);
int pe = S;
while( pos[pe] == 0 ){
pos[pe] = 1;
pe--;
}
res -= (S-pe);
for( int i = ps; i <= pe; i++ ){
if( pos[i] == 0 ){
int tmp = 0;
while( pos[i] == 0 && i <= pe ){
i++;
tmp++;
}
blos[num] = tmp;
num++;
}
}
sort(blos,blos+num,cmp);
for( int i = 0; i < M-1; i++ ){
res -= blos[i];
}
printf("%d\n",res);
}
return 0;
}