优先队列的尝试 (Stall Reservations)

来源:互联网 发布:登录mysql命令 编辑:程序博客网 时间:2024/06/16 22:08

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
51 102 43 65 84 7
Sample Output
412324
Hint
Explanation of the sample: 

Here's a graphical schedule for this output: 

Time     1  2  3  4  5  6  7  8  9 10Stall 1 c1>>>>>>>>>>>>>>>>>>>>>>>>>>>Stall 2 .. c2>>>>>> c4>>>>>>>>> .. ..Stall 3 .. .. c3>>>>>>>>> .. .. .. ..Stall 4 .. .. .. c5>>>>>>>>> .. .. ..
Other outputs using the same number of stalls are possible.

这道题仅仅用贪心的话会超时,所以需要用优先队列优化

题解:

点击打开链接http://blog.csdn.net/qq_25077279/article/details/48978303

有关优先队列的博客:

点击打开链接http://www.cnblogs.com/heqinghui/p/3225407.html

点击打开链接http://www.cnblogs.com/luoxn28/p/5616101.html

点击打开链接http://blog.csdn.net/u011240016/article/details/59266961

超时代码:

#include<cstdio>#include<string.h>#include<algorithm>using namespace std;struct list{int bi;int en;int num;int sta;}an[50010];bool cmp(struct list a,struct list b){return a.bi<b.bi;}bool com(struct list a,struct list b){return a.num<b.num;}int main(){int n,i,max,j,cnt;max=0,cnt=1;memset(an,0,sizeof(an));scanf("%d",&n);for(i=0;i<n;i++){scanf("%d%d",&an[i].bi,&an[i].en);an[i].num=i;if(an[i].bi>max)max=an[i].bi;}sort(an,an+n,cmp);for(i=0;i<n;i++){int end;if(an[i].sta!=0)continue;else{an[i].sta=cnt;end=an[i].en;if(an[i].en>max){cnt++;continue;}}for(j=i+1;j<n;j++){if(an[i].en>max)break;if(an[j].sta!=0)continue;if(an[j].bi>end){an[j].sta=cnt;end=an[j].en;}}cnt++;}sort(an,an+n,com);printf("%d\n",cnt-1);for(i=0;i<n;i++){printf("%d\n",an[i].sta);}return 0; } 

ac代码:

#include<cstdio>#include<string.h>#include<algorithm>#include<queue>using namespace std;struct list{int bi;int en;int num;int sta;friend bool operator < (struct list a,struct list b){return a.en>b.en;  //注意操作符 }}an[50010];bool cmp(struct list a,struct list b){return a.bi<b.bi;}bool com(struct list a,struct list b){return a.num<b.num;}int main(){int n,i,cnt;priority_queue <struct list> q;cnt=1;memset(an,0,sizeof(an));scanf("%d",&n);for(i=0;i<n;i++){scanf("%d%d",&an[i].bi,&an[i].en);an[i].num=i;}sort(an,an+n,cmp);an[0].sta=cnt;  //注意 q.push(an[0]);for(i=1;i<n;i++){if(an[i].bi<=q.top().en){cnt++;an[i].sta=cnt;q.push(an[i]);}else{an[i].sta=q.top().sta;q.pop();q.push(an[i]);}}sort(an,an+n,com);printf("%d\n",cnt);for(i=0;i<n;i++){printf("%d\n",an[i].sta);}return 0; } 


原创粉丝点击