这一题,简单的贪心,可是WR了好多次,坑,原因是输入3 10 1 5 6 10 10 10,这样的1到5,6到10,也算连续的!~~坑了。
下面是AC的代码:
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; class data { public: int first, second; }; data Da[25005]; int N, T; int cmp(const data& a, const data& b) //按区间的开头排序,从小到大 { if(a.first != b.first) return a.first < b.first; else return a.second < b.second; } int solve() { int ans = 0; int fir = 0, max = -1; for(int i = 0; i < N; i++) { if(fir + 1 >= Da[i].first) //第i个区间的开头是否大于fir + 1 { if(max < Da[i].second) //是的,找到区间长度最大的,也就是区间的结尾最大的 max = Da[i].second; if(max >= T) //到了T了,退出 { ans++; //数量+1 break; } } else { fir = max; //fir = max,也就是等于前面找到的区间结尾最大的 if(fir + 1 < Da[i].first) //中间空了一段,不能连续 return -1; else //否则i自减,避免跳过了一个 i--; ans++; } } if(max < T) //不能到T,返回-1; return -1; return ans; } int main() { while(scanf("%d%d", &N, &T) != EOF) { for(int i = 0; i < N; i++) scanf("%d%d", &Da[i].first, &Da[i].second); sort(Da, Da + N, cmp); //排序 if(Da[0].first > 1) printf("-1\n"); else { int ans = solve(); printf("%d\n", ans); } } return 0; }
原文地址:http://blog.csdn.net/qq_25425023/article/details/45568705