poj2376 Cleaning Shifts

来源:互联网 发布:2017双十一数据 编辑:程序博客网 时间:2024/05/17 08:28
题意:已知有n个区间,和一个数字t。要求用最少的区间数去覆盖[1,t]这个区间,如果不能完全覆盖,输出-1
按区间起点由大到小排序,每次都寻找覆盖的最广的区间来覆盖部分。
#include<cstdio>#include<algorithm>#define Max(a,b) a>b?a:busing namespace std;struct time{int start;int end;}data[25001];bool cmp(time a,time b){return a.start<=b.start;}int main(){int n,t,ans=0;scanf("%d%d",&n,&t);for(int i=0;i<n;i++)scanf("%d%d",&data[i].start,&data[i].end);sort(data,data+n,cmp);int index=0;int end=0;while(end<t){int begin = end+1;for(int i=index;i<n;i++){if(data[i].start<=begin){if(data[i].end>=begin)end = Max(end,data[i].end);}else{index=i;break;}}if(begin>end){printf("-1\n");return 0;}else{ans++;}}printf("%d\n",ans);return 0;}

0 0
原创粉丝点击