USACO Barn Repair

本文详细解析了USACO竞赛题目Barn Repair的解决方案,通过将畜栏按编号排序并计算间隔距离,采用贪心算法确定最少覆盖方案。介绍了C语言实现代码,帮助读者理解算法思想。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值