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