您的位置:首页 > 大数据 > 人工智能

USACO Barn Repair(greedy)

2015-07-17 22:17 525 查看
题目请点我

题解:

简单贪心,先全部覆盖上,然后去掉两头,之后每次去掉一个最大的间隙。

代码实现:

/*
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  greedy