USACO 1.3.2 Barn Repair


题目概述:

这道题是说在一个风雨交加的夜晚之后农夫家的院子倒了,然后他的牛不能置之不理就要修。但是呢农夫自然想要买最少长度的木板,供应商可以给他提供任意长度的木板,但是总数量是有限制的,我们的目标就是算出这个最短长度。

算法思想:

很明显的贪心好么说动规的确实厉害但是这么水的题不适合用那高级的方法。

大意就是,先开出一个记录每个牛所在位置的数组,然后再开一个记录两个牛间隔的数组,然后取间隔最大的几个(比如给4块木板就取最大的三个间隔),然后经过数学计算算出需要用木板覆盖的最大长度。

这个题交了好几次,说说为什么错吧,最开始是因为没有找好公式,应该是last - start + 1 - sum of diff. 后来还有错的原因是忽略了数据有可能是无序的。(我觉得虽然对于这道水题来说改一改就好了,不过这根弦一定要在脑子里,否则正式场合容易跪),还有错的原因是忽略了木板数可以比牛的数目多(这个也要记住,理由同上个括号)。 

代码部分:

#include <iostream>
#include <list>
#include <map>
#include <string.h>
#include <string>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("barn1.in");
ofstream fout("barn1.out");
int n,m,s; const int INF = 100000000;
int num[217];
int diff[217];

bool cmp(int a, int b) {
	return a > b;
}

int main() {
	fin >> n >> m >> s;
	if (n >= s) {
		fout << s << endl;
		return 0;
	}
	int start, last;
	for (int i = 0; i < s; i++) {
		fin >> num[i];
	}

	sort(num, num + s);
	start = num[0]; last = num[s - 1];
	for (int i = 1; i <= s; i++) {
		diff[i] = num[i] - num[i - 1]-1;
	}
	diff[0] = 0;
	sort(diff, diff + s,cmp);
	int res = 0;
	for (int i = 0; i < n-1; i++) {
		res += diff[i];
	}
	fout << last - start +1 - res << endl;
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值