题意:已知有n个区间,和一个数字t。要求用最少的区间数去覆盖[1,t]这个区间,如果不能完全覆盖,输出-1
按区间起点由大到小排序,每次都寻找覆盖的最广的区间来覆盖部分。
#include<cstdio>
#include<algorithm>
#define Max(a,b) a>b?a:b
using 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;
}