代码 https://www.cnblogs.com/oscar-cnblogs/p/6295076.html
poj2376题
题意:农夫John和他的cows系列。这次cows们被John命令cleaning shifts,给你总区间时间,和每头cow负责clean的子区间时段,问怎样安排可以使最少的cow打扫于整个时间区间。
思路:典型贪心。先对所有cow开始clean的时间升序排序,然后再依次遍历每头cow,保证开始时间在上一头cow时段内,使结束时间最长。(注意:不重叠但相邻也成立)一旦超出上一头cow的结束时段,更新cow,并继续向下遍历。
输入的第一行 n,T n表示有几个区间,T表示终点是多少,从一开始到T的区间全覆盖,下面2~2+n行是输入的区间,求最小覆盖区间数
输入
3 10 1 7 3 6 6 10
输出
2
#include <iostream> #include <stdio.h> #include <algorithm> using namespace std; typedef long long ll; ll T,N; struct Cow { ll st,ed; bool operator < (Cow c) const//按照结束时间升序排列 重载操作符 { return st < c.st; } } cow[25005]; //贪心策略 在合适的工作时间内 选择结束时间最晚的 int main() { cin>>N>>T; for (int i = 0; i < N; i++) { scanf("%lld%lld", &cow[i].st, &cow[i].ed); } //printf("%d ", solve()); sort(cow, cow+N); cow[N].st = 0x7fffffff;//因为后面要判断cow[i+1] bool found = false; ll t = 0, temp = 0; int ans = 0; for (int i = 0; i < N; i++)//这样只用找一遍即可,从小到大排列 不断的扩大t 扩大课工作时间的区间 { // found = false; if (cow[i].st <= t + 1) { if(cow[i].ed > temp) { temp = cow[i].ed; found = true; } if (cow[i+1].st > t+1 && found)//如果下一个 区间左端点 在t的右边 那么所找到的这个点是必然要要的 { t = temp; ans++; found = false;//t点更新 就去找下一个区间 这个之前放错了位置 每一次found都会改变t值 } } } if (t<T) printf("-1 "); else printf("%d ",ans); return 0; }
这个代码看了之后也不太理解,先记在这,等把工作排序问题搞懂再来看看理解理解吧
另一组输入数据可以调试看看代码的实际运行
3 10
1 6
1 5
6 10
输出也是
2