代码疯子

http://www.programlife.net/

USACO Barn Repair

贪心问题。首先可以按照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

作者:代码疯子

您可能对下面的文章也感兴趣:
  1. USACO Milking Cows (31.2)
  2. USACO Mixing Milk (26.9)
  3. USACO Transformations (24.7)
  4. USACO Calf Flac (24.2)
  5. USACO Broken Necklace (23.9)

阅读更多
文章标签: file c
个人分类: ACM-ICPC竞赛
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭