POJ 3190 Stall Reservations

来源:互联网 发布:生命之花 伤感网络歌曲 编辑:程序博客网 时间:2024/05/23 02:02
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:
  • 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.

考虑到应该需要排列然后贪心,但是每次判断的项因为每一个数的插入二改变,这时可以考虑利用优先队列,注意此题应用优先队列为最小堆,需要在struct里面进行友元定义

至于priority_queue的简单的大小顶堆定义也可以通过声明时来定义:
priority_queue<TYPE,vector<TYPE>,greater<TYPE>> Q;
其中greater<TYPE>为大顶堆,less<TYPE>为小顶堆

#include<iostream>#include<cstdlib>#include<cstring>#include<cstdio>#include<queue>#include<algorithm>using namespace std;const int maxn=50010;int s[maxn],ans,n;struct point{int a,b,cnt;friend bool operator < (point x,point y){return x.b>y.b;}}p[maxn];priority_queue<point> q;bool cmp(point x,point y){return x.a<y.a||(x.a==y.a&&x.b<y.b);}int main(){while(~scanf("%d",&n)){ans=0;memset(s,0,sizeof(s));memset(p,0,sizeof(p));for(int i=1;i<=n;i++){scanf("%d%d",&p[i].a,&p[i].b);p[i].cnt=i;}sort(p+1,p+n+1,cmp);s[p[1].cnt]=++ans; //N.B.此处并非s[1],而应是排列后的第一项q.push(p[1]);for(int i=2;i<=n;i++){point tmp=q.top();if(tmp.b<p[i].a){s[p[i].cnt]=s[tmp.cnt];q.pop();}else s[p[i].cnt]=++ans;q.push(p[i]);}printf("%d\n",ans);for(int i=1;i<=n;i++)printf("%d\n",s[i]);}return 0;}


0 0
原创粉丝点击