Language: Default 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 Help FJ by determining:
Many answers are correct for each test dataset; a program will grade your answer. 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. 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 |
题意:给出每个奶牛挤奶的时间段,一个机器一次只能对一头奶牛工作,问至少需要多少台机器,并输出每头奶牛使用的机器编号。
思路:先按照每头牛的开始时间从小到大排序,维护一个优先队列,n头牛依次入队,时间结束早的先出队列,比较最早出来的牛的结束时间和当前准备入队的牛的开始时间,若前者小于后者,则当前的牛可以用前面空出来的机器,否者要添加一台新机器。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <string> #include <map> #include <stack> #include <vector> #include <set> #include <queue> #pragma comment (linker,"/STACK:102400000,102400000") #define maxn 50010 #define MAXN 2005 #define mod 1000000009 #define INF 0x3f3f3f3f #define pi acos(-1.0) #define eps 1e-6 #define lson rt<<1,l,mid #define rson rt<<1|1,mid+1,r #define FRE(i,a,b) for(i = a; i <= b; i++) #define FRL(i,a,b) for(i = a; i < b; i++) #define mem(t, v) memset ((t) , v, sizeof(t)) #define sf(n) scanf("%d", &n) #define sff(a,b) scanf("%d %d", &a, &b) #define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c) #define pf printf #define DBG pf("Hi\n") typedef long long ll; using namespace std; struct Cow { int s,t; int local; }cow[maxn]; int cmp(Cow a,Cow b) { if (a.s==b.s) return a.t<b.t; return a.s<b.s; } priority_queue<Cow>Q; int ans[maxn]; int n; bool operator<(Cow a,Cow b) { return a.t>b.t; } int main() { int i,j; Cow st; while (~sf(n)) { FRL(i,0,n) { sff(cow[i].s,cow[i].t); cow[i].local=i; } sort(cow,cow+n,cmp); Q.push(cow[0]); int cnt=1; ans[ cow[0].local ]=cnt; FRL(i,1,n) { if (!Q.empty()&&Q.top().t<cow[i].s) { st=Q.top(); Q.pop(); ans[ cow[i].local ]=ans[ st.local ]; } else ans[ cow[i].local ]=++cnt; Q.push(cow[i]); } printf("%d\n",cnt); FRL(i,0,n) pf("%d\n",ans[i]); } return 0; } /* 5 1 10 2 4 3 6 5 8 4 7 */