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