贪心问题。首先可以按照stall的编号从小到大排序,然后计算每个stall编号之见的距离,再按照距离从大到小排序(也可以从小到大,反正排序就行了),然后找出M-1个最大的距离,这些都是分隔段,其他的stall都是应该被覆盖的。
比如,1 3 9,给一个board的话,肯定是全部覆盖;如果能给两个board,则是一个覆盖1,2,3;另一个覆盖9。题目大概就是这个意思:
/*
ID:stackex1
LANG:C
PROG:barn1
*/
#include <stdio.h>
#include <stdlib.h>
#define MAX_LEN 512
int cmp(const void *pa, const void *pb)
{
return *(int*)(pa) > *(int*)(pb) ? 1 : -1;
}
int main(int argc, char **argv)
{
FILE* fin = fopen("barn1.in", "r");
FILE* fout = fopen("barn1.out", "w");
int i, m, s, c, res;
int diff[MAX_LEN], src[MAX_LEN];
fscanf(fin, "%d %d %d", &m, &s, &c);
for(i = 0; i < c; ++i)
fscanf(fin, "%d", &src[i]);
qsort(src, c, sizeof(src[0]), cmp);
for(i = 0; i < c-1; ++i)
diff[i] = src[i+1] - src[i];
qsort(diff, c-1, sizeof(diff[0]), cmp);
res = src[c-1] - src[0] + 1;
for(i = c-2; i >= 0 && m > 1; --i, --m)
res -= (diff[i] - 1);
fprintf(fout, "%d\n", res);
fclose(fin);
fclose(fout);
return 0;
}
本文出自程序人生 >>
USACO Barn Repair
作者:代码疯子
您可能对下面的文章也感兴趣:
- USACO Milking Cows (31.2)
- USACO Mixing Milk (26.9)
- USACO Transformations (24.7)
- USACO Calf Flac (24.2)
- USACO Broken Necklace (23.9)