清洁轮班-----坑死我了

农夫约翰正在分配他的一些牛(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;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值