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:
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
*/