Input
* Line 1: Two space-separated integers: N and T * Lines 2..N+1: Each line contains the start and end times of the interval during which a cow can work. A cow starts work at the start time and finishes after the end time.Output
* Line 1: The minimum number of cows Farmer John needs to hire or -1 if it is not possible to assign a cow to each shift.Sample Input
3 10 1 7 3 6 6 10Sample Output
2Hint
This problem has huge input data,use scanf() instead of cin to read data to avoid time limit exceed. INPUT DETAILS: There are 3 cows and 10 shifts. Cow #1 can work shifts 1..7, cow #2 can work shifts 3..6, and cow #3 can work shifts 6..10. OUTPUT DETAILS: By selecting cows #1 and #3, all shifts are covered. There is no way to cover all the shifts using fewer than 2 cows. 题意:农夫John和他的cows系列。这次cows们被John命令cleaning shifts,给你总区间时间,和每头cow负责clean的子区间时段,问怎样安排可以使最少的cow打扫于整个时间区间。 思路:典型贪心。先对所有cow开始clean的时间升序排序,然后再依次遍历每头cow,保证开始时间在上一头cow时段内,使结束时间最长。(注意:不重叠但相邻也成立)一旦超出上一头cow的结束时段,更新cow,并继续向下遍历。 #include<stdio.h> #include<algorithm> using namespace std; struct Node{ int l,r; }node[25005]; bool cmp(Node a,Node b) { if(a.l==b.l) return a.r>b.r; return a.l<b.l; } int main() { int n,t,c,f,min,max,i; scanf("%d%d",&n,&t); for(i=1;i<=n;i++){ scanf("%d%d",&node[i].l,&node[i].r); } sort(node+1,node+n+1,cmp); c=1;f=0; min=node[1].r; max=node[1].r; for(i=2;i<=n;i++){ if(node[i].l<=min+1){ //坑点。。相邻即相连 if(node[i].r>max){ f=1; max=node[i].r; if(max>=t) break; } } else{ min=max; c++; f=0; if(node[i].l<=min+1){ //同上 if(node[i].r>max){ f=1; max=node[i].r; if(max>=t) break; } } else break; } } if(node[1].l<=1&&max>=t) printf("%d\n",c+f); else printf("-1\n"); return 0; }
转载于:https://www.cnblogs.com/yzm10/p/7260855.html
