题意:给出了n只牛的工作时间以及总的工作时间t,求最少用多少牛就可以把1-t的时间覆盖完。
题目好多坑- -,
1.如果起始时间的最小值不是1就不能开始工作。
2.加入某只牛在t1时间结束,那么接班的那只牛可以再t1+1时间开始工作。
3.这一点大家都一般都不会掉进去,我掉进去了- -,排序先按照起始时间排序再按照结束时间排序,忘记考虑某些起始时间比较小,但是结束时间比较晚的情况了。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
using namespace std;
struct node
{
int x,y;
}s[30000];
int cmp(const void *a,const void *b)
{
if((*(node*)a).x==(*(node*)b).x)
return (*(node*)a).y-(*(node*)b).y;
return (*(node*)a).x-(*(node*)b).x;
}
int main()
{
int n,t;
while(cin>>n>>t)
{
for(int i=0;i<n;i++)
cin>>s[i].x>>s[i].y;
qsort(s,n,sizeof(node),cmp);
s[n].x=0x7fffffff;
int ans=0,pos=0;//pos代表当前位置,因为第一次开始时间必须是1,就先设置成0
int i=0;
while(i<n)
{
int maxend=-1;
if(pos+1<s[i].x)
break;
while(pos+1>=s[i].x&&i<n)//找到当前时间前的所有牛的最大结束时间
{
if(s[i].y>maxend)
maxend=s[i].y;
i++;
}
ans++;
pos=maxend;
if(pos>=t)
break;
}
if(pos>=t)
cout<<ans<<endl;
else
cout<<-1<<endl;
}
return 0;
}