题目链接http://poj.org/problem?id=3190
Stall Reservations
Time Limit: 1000MS | Memory Limit: 65536K | |||
Total Submissions:10223 | Accepted:3608 | Special Judge |
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:
Help FJ by determining:
- The minimum number of stalls required in the barn so that each cow can have her private milking period
- An assignment of cows to these stalls over time
Input
Line 1: A single integer, N
Lines 2..N+1: Line i+1 describes cow i's milking interval with two space-separated integers.
Lines 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.
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:
Here's a graphical schedule for this output:
Time 1 2 3 4 5 6 7 8 9 10Other outputs using the same number of stalls are possible.
Stall 1 c1>>>>>>>>>>>>>>>>>>>>>>>>>>>
Stall 2 .. c2>>>>>> c4>>>>>>>>> .. ..
Stall 3 .. .. c3>>>>>>>>> .. .. .. ..
Stall 4 .. .. .. c5>>>>>>>>> .. .. ..
需要用到贪心思想的模拟题。难点是维护每一个畜栏的结束时间。
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #include<string> #include<vector> #include<queue> #define DEBUG(x) cout<<#x<<" = "<<x<<endl using namespace std; const int MAXN=5e4+100; struct cow{ int s,e; int idx; cow(){} cow(int ss,int ee,int i):s(ss),e(ee),idx(i){} bool operator<(const cow &c)const { return s<c.s; } }; struct stall{ int et; int no; stall(int e,int n):et(e),no(n){} stall(){} bool operator<(const stall &s)const { return et>s.et; } }; int N; int pos[MAXN]; cow cowarray[MAXN]; int main() { // freopen("in.txt","r",stdin); cin>>N; for(int i=0;i<N ;i++ ){ int s,e; scanf("%d%d",&s,&e); cowarray[i].s=s, cowarray[i].e=e, cowarray[i].idx=i; } sort(cowarray,cowarray+N); priority_queue<stall>pq; int cnt=1; cow &c=cowarray[0]; pq.push(stall(c.e,cnt)); ///这是一个经常出现的bug,且难以发现,排序之后的下标和之前的下标不同 // pos[0]=cnt; pos[c.idx]=cnt; for(int i=1;i<N ;i++ ){ stall st=pq.top(); if(st.et<cowarray[i].s){ pq.pop(); st.et=cowarray[i].e; int idx=cowarray[i].idx; pos[idx]=st.no; pq.push(st); } else{ cnt++; cow &t=cowarray[i]; pq.push(stall(t.e,cnt)); pos[t.idx]=cnt; } } printf("%d ",cnt); for(int i=0;i<N ;i++ ){ printf("%d ",pos[i]); // cout<<pos[i]<<endl; } }