您的位置:首页 > 其它

Stall Reservations 贪心+自定义优先级的优先队列(求含不重叠子序列的多个序列最小值问题)

2017-07-20 16:41 453 查看
Stall Reservations

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 period

An 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, 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. //!!!

首先根据挤奶时间的先后顺序排序。。。然后将第一头牛加入优先队列。。然后就是加入优先队列的牛应该根据越早结束挤奶那么优先级更高,如果时间结束点相等,那么开始时间早的优先级高。。。

然后从前向后枚举。如果碰到有牛的挤奶时间的开始值大于优先队列的首部的结束值,那么说明这两头牛可以一起公用一个挤奶房。。然后从优先队列中删除这头牛。。那么这个问题就得到解决了。。。

开始时间升序排序,从左往右排,不会出现排在队首左边的情况。(贪心)

总结:开始时间升序排,每个条件都用上,求含不重叠子序列的最少序列数;

结束时间升序排,只用部分条件,求一个序列含不重叠子序列最多数。

#include<stdio.h>
#include<algorithm>
#include<queue>
using namespace std;

struct Node{
int x,y,no;
friend bool operator<(Node a,Node b)
{
if(a.y==b.y) return a.x>b.x;
return a.y>b.y;
}
}node[50005];
bool cmp(Node a,Node b)
{
if(a.x==b.x) return a.y<b.y;
return a.x<b.x;
}
int a[50005];
priority_queue<Node> q;
int main()
{
int n,c,i;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d%d",&node[i].x,&node[i].y);
node[i].no=i;
}
sort(node+1,node+n+1,cmp);
q.push(node[1]);
a[node[1].no]=1;
c=1;
for(i=2;i<=n;i++){
if(q.size()&&node[i].x>q.top().y){
a[node[i].no]=a[q.top().no];
q.pop();
}
else{
c++;
a[node[i].no]=c;
}
q.push(node[i]);
}
printf("%d\n",c);
for(i=1;i<=n;i++){
printf("%d\n",a[i]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: