现在的位置: 首页 > 综合 > 正文

USACO 1.3.2 Barn Repair

2017年10月16日 ⁄ 综合 ⁄ 共 983字 ⁄ 字号 评论关闭

题目概述:

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

算法思想:

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

大意就是,先开出一个记录每个牛所在位置的数组,然后再开一个记录两个牛间隔的数组,然后取间隔最大的几个(比如给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;
}

抱歉!评论已关闭.