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

USACO 1.2 Problem 1

2017年11月21日 ⁄ 综合 ⁄ 共 1020字 ⁄ 字号 评论关闭

这节开始讲complete search了。吃饭前做了一下这个题被坑到了= =不难。

题目描述:

嗯就是说农民喂牛,然后给农民数目,给没一个农民开始喂牛和结束喂牛的时间。然后要求计算牛有人喂的最长时间段,并且计算牛没有人喂的最长时间段。

算法思想:

嗯嗯最开始的时候思考了一下,既然是第一题一定很简单,说不定给定的数据都是有序的。

嗯然后跪了。

然后就有了用stl::map的想法,因为插入到map之后会自动排序,那么这样的话就是做了一个link sort,提取的时候也方便。

至于接下来的具体算法,就是检测下一个数据的开始时间和上一个数据的结束时间的大小,如果能够拼接起来就说明一直持续有人喂,那么把起始时间设为前一组数据的起始,结束时间设为后一组数据的结束,以此类推接下去的过程。

如果无法拼接,就说明有裂缝,然后计算裂缝的大小,跟最初的裂缝大小比较看哪个大就更新哪个就好了。

代码部分:

#include <fstream>
#include <iostream>
#include <map>
using namespace std;
ifstream fin("milk2.in");
ofstream fout("milk2.out");
int n;
int main() {
	fin >> n;
	int a, b;
	map<int, int> mymap;
	for (int i = 0; i < n; i++){
		fin >> a >> b;
		mymap.insert(make_pair(a, b));
	}

	int res1 = 0, res2 = 0;
	int left, right;

	for (map<int, int>::iterator it = mymap.begin(); it != mymap.end(); ++it){
		if (it == mymap.begin()) {
			left = it->first; right = it->second;
			res1 = right - left;
			continue;
		}
		if ((it->first) <= right) {
			right = (it->second>right) ? it->second : right;
			res1 = (res1>(right - left)) ? res1 : (right - left);
		}
		else {
			res2 = (res2>(it->first - right)) ? res2 : (it->first - right);
			left = it->first; right = it->second;
		}
	}
	fout << res1 << " " << res2 << endl;

	return 0;
}
【上篇】
【下篇】

抱歉!评论已关闭.