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 Output Line 1: The minimum number of stalls the barn must have. Sample Input Sample Output 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
|
1.学会优先队列的使用。
2.解题思路:
1) 把所有奶牛按开始时间从小到大排序。
2) 为第一头奶牛分配个畜栏。
3) 依次处理后面每头奶牛 i。处理 i时,考虑已分配畜栏中结束间最 早的畜栏 x。
若 E(x) < S( E(x) < S( E(x) < S( i), 则不用分配新畜栏, i可进入 x, 并修改 E(x) 为E( i)
若 E(x) >= S( E(x) >= S( E(x) >= S(E(x) >= S( i),则分配新畜栏 y, 记 E( y) = E( y) = i)
直到所有奶牛处理结束
始终 需要用优先队列存放已经分配的畜栏,并使得结束时间最早始终 需要用优先队列存放已经分配的畜栏。
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<queue>
#include<vector>
using namespace std;
struct cows
{
int s;
int end;
int no;
bool operator<(const cows &c)const
{
return s<c.s;
}
}cow[50006];
int pos[50006];
struct stall
{
int end;
int no;
bool operator <(const stall &s)const
{
return end>s.end;
}
stall(int e,int n):end(e),no(n){}
};
int main()
{
int n;
int all=0;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>cow[i].s>>cow[i].end;
cow[i].no=i;
}
sort(cow,cow+n);
priority_queue<stall>q;
for(int i=0;i<n;i++)
{
if(q.empty())//没有空的,直接申请
{
all++;//栅栏数加一
q.push(stall(cow[i].end,all));//将该牛结束的时间作为栅栏开始使用的时间,all作为编号
pos[cow[i].no]=all;
}
else
{
stall sta=q.top();//优先队列 (大根堆模型)
if(sta.end<cow[i].s)//如果栅栏结束的时间 ,比下一头牛申请的开始时间小,就可以使用
{
q.pop();
pos[cow[i].no]=sta.no;
q.push(stall(cow[i].end,sta.no));
}
else//都不合适,还得重新申请
{
all++;
q.push(stall(cow[i].end,all));
pos[cow[i].no]=all;
}
}
}
cout<<all<<endl;
for(int i=0;i<n;i++)
{
cout<<pos[i]<<endl;
}
return 0;
}