农夫约翰正在分配他的一些牛(1<=N<=25,000)在谷仓周围做一些清洁工作。他总是希望有一只牛在清理东西,并把一天分成T班(1<=T<=1 000 000),第一次是轮班1,最后一次是轮班T。
每头奶牛只能在白天的某一段时间内进行清洁工作。任何被挑选来做清洁工作的母牛都会在整个时间间隔内工作。
你的工作是帮助农夫约翰分配一些牛来轮班,这样(一)每班至少有一头牛被分配给它,和(二)尽可能少的奶牛参与清洁。如果不可能为每班分配一头牛,请打印-1。
输入
*第1行:两个空格分隔的整数:n和T
*第2行.N+1:每一行都包含奶牛可以工作的间隔的开始和结束时间。母牛在开始时开始工作,在结束时间后结束工作。
输出量
*第1行:农场主约翰需要雇用的牛的最低数量,或-1,如果不可能为每班分配一头牛。
样本输入
3 10
1 7
3 6
6 10
样本输出
2
暗示
这个问题有大量的输入数据,使用scanf()代替CIN来读取数据,以避免超过时间限制。
输入详情:
有3头母牛和10班轮班。牛#1可以工作1.7,牛#2可以工作3.6,牛#3可以工作6.10。
产出详情:
通过选择牛#1和#3,所有的轮班都包括在内。没有办法用不到两头牛来覆盖所有的轮班。
#include<stdio.h>
#include<algorithm>
using namespace std;
struct node{
long long st;
long long end;
}cow[25010];
int cmp(struct node a,struct node b){
if(a.st>b.st)
return 0;
else if(a.st<b.st)
return 1;
else {
if(a.end<b.end)
return 1;
else return 0;
}
}
int main(){
long long n,T,count=0;
scanf("%lld %lld",&n,&T);
for(int i=0;i<n;i++){
scanf("%d %d",&cow[i].st,&cow[i].end);
if(cow[i].end<cow[i].st){
long long t=cow[i].st;
cow[i].st=cow[i].end;
cow[i].end=t;
}
}
sort(cow,cow+n,cmp);
/* for(int i=0;i<n-1;i++){
for(int j=0;j<n;j++){
if(cow[i].st>cow[j].st){
struct node t=cow[i];
cow[i]=cow[j];
cow[j]=t;
}
if(cow[i].st==cow[j].st&&cow[i].end>cow[j].end){
struct node t=cow[i];
cow[i]=cow[j];
cow[j]=cow[i];
}
}
}*/ //加注释部分排序错误
long long stop,big=0,i=0;
while(i<n){
stop=big+1;
while(cow[i].st<=stop){
if(cow[i].end>big)
big=cow[i].end;
i++;
}
//如果big>stop,说明此牛可行;如果不可行,之后再也不会进入内层的while循环
if(big>=stop){
count++;
if(big>=T){
break;
}
i--;//缓冲一下内层while循环的最后的i++;
}
i++;
}
if(big>=T)
printf("%d\n",count);
else printf("-1\n");
return 0;
}