题目链接:
啊哈哈,点我点我思路:
首先根据挤奶时间的先后顺序排序。。。然后将第一头牛加入优先队列。。然后就是加入优先队列的牛应该根据越早结束挤奶那么优先级更高,如果时间结束点相等,那么开始时间早的优先级高。。。
然后从前向后枚举。如果碰到有牛的挤奶时间的开始值大于优先队列的首部的结束值,那么说明这两头牛可以一起公用一个挤奶房。。然后从优先队列中删除这头牛。。那么这个问题就得到解决了。。。
题目:
Language: Stall Reservations
Description Oh those picky N (1 <= N <= 50,000) cows! They are so picky that each one will only be milked over some precise time interval A..B (1 <= A <= B <= 1,000,000), which includes both times A and B. Obviously, FJ must create a reservation system to determine which stall each cow can be assigned for her milking time. Of course, no cow will share such a private moment with other cows.Help FJ by determining: The minimum number of stalls required in the barn so that each cow can have her private milking periodAn assignment of cows to these stalls over time Many answers are correct for each test dataset; a program will grade your answer. Input Line 1: A single integer, NLines 2..N+1: Line i+1 describes cow i's milking interval with two space-separated integers. Output Line 1: The minimum number of stalls the barn must have.Lines 2..N+1: Line i+1 describes the stall to which cow i will be assigned for her milking period. Sample Input 5 1 10 2 4 3 6 5 8 4 7 Sample Output 4 1 2 3 2 4 Hint Explanation of the sample:Here's a graphical schedule for this output: Time 1 2 3 4 5 6 7 8 9 10 Stall 1 c1>>>>>>>>>>>>>>>>>>>>>>>>>>> Stall 2 .. c2>>>>>> c4>>>>>>>>> .. .. Stall 3 .. .. c3>>>>>>>>> .. .. .. .. Stall 4 .. .. .. c5>>>>>>>>> .. .. ..Other outputs using the same number of stalls are possible. Source USACO 2006 February Silver |
||||||||||
代码为:
#include#include #include #include using namespace std; const int maxn=50000+10; int order[maxn]; struct Node { int st,en,pos; friend bool operator<(Node a,Node b) { if(a.en==b.en) return a.st b.en; } }node[maxn]; bool cmp(Node a,Node b) { if(a.st==b.st) return a.en Q; int main() { int n,ans; while(~scanf("%d",&n)) { for(int i=1;i<=n;i++) { scanf("%d%d",&node[i].st,&node[i].en); node[i].pos=i; } sort(node+1,node+1+n,cmp); ans=1; Q.push(node[1]); order[node[1].pos]=1; for(int i=2;i<=n;i++) { if(!Q.empty()&&Q.top().en