USACO 1.2 Problem 1

来源:互联网 发布:黑色星期五禁曲 知乎 编辑:程序博客网 时间:2024/04/30 09:36

这节开始讲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;}


0 0
原创粉丝点击