清洁轮班-----坑死我了
农夫约翰正在分配他的一些牛(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
#include
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.stcow[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(ibig)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;
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
