Stall Reservations(POJ 3190 贪心+优先队列)
2016-01-28 13:06
399 查看
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.
Sample Input
Sample Output
Hint
Explanation of the sample:
Here's a graphical schedule for this output:
Other outputs using the same number of stalls are possible.
这个题是说一些奶牛要在指定的时间内挤牛奶,而一个机器只能同时对一个奶牛工作。给你每头奶牛的指定时间的区间,问你最小需要多少机器。
先按奶牛要求的时间起始点进行从小到大排序,然后维护一个优先队列,里面以已经开始挤奶的奶牛的结束时间早为优先。然后每次只需要检查当前是否有奶牛的挤奶工作已经完成的机器即可,若有,则换那台机器进行工作。若没有,则加一台新的机器。
TLE CODE:
Time Limit: 1000MS | Memory Limit: 65536K | |||
Total Submissions: 4434 | Accepted: 1588 | Special Judge |
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 <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <queue> using namespace std; const int maxn=60000; int n,use[maxn]; struct Node { int l; int r; int pos; bool operator <(const Node &a)const { if(r==a.r) return l>a.l; return r>a.r; } }a[maxn]; priority_queue<Node> q; bool cmp(Node a,Node b) { if(a.l==b.l) return a.r<b.r; return a.l<b.l; } int main() { while(scanf("%d",&n)!=EOF) { for(int i=0;i<n;i++) { scanf("%d%d",&a[i].l,&a[i].r); a[i].pos=i; } sort(a,a+n,cmp); q.push(a[0]); int now=0,ans=1; use[a[0].pos]=1; for(int i=1;i<n;i++) { if(!q.empty()&&q.top().r<a[i].l) { use[a[i].pos]=use[q.top().pos]; q.pop(); } else { ans++; use[a[i].pos]=ans; } q.push(a[i]); } printf("%d\n",ans); for(int i=0;i<n;i++) printf("%d\n",use[i]); while(!q.empty()) q.pop(); } return 0; }
TLE CODE:
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; struct node { int x1,x2; int num; }a[50000+10]; bool cmp(node a,node b) { if(a.x1==b.x1) return a.x2<b.x2; return a.x1<b.x1; } bool vis[50000+10]; int pos[50000+10]; int n; int search(int m) { int l=0,r=n-1,mid,k=-1; while(l<=r) { mid=(l+r)/2; if(a[mid].x1>=m) { k=mid; r=mid-1; } else l=mid+1; } return k; } int main() { int i,j; freopen("in.txt","r",stdin); while(scanf("%d",&n)!=EOF) { int count=0; memset(vis,0,sizeof(vis)); fill(pos,pos+n,0); for(i=0;i<n;i++) { scanf("%d%d",&a[i].x1,&a[i].x2); a[i].num=i; } sort(a,a+n,cmp); int last,coun=0,p; for(i=0;i<n;i++) { if(vis[i]) continue; last=a[i].x2+1; vis[i]=1; pos[a[i].num]=++coun; while(1) { p=search(last); if(p==-1) break; if(vis[p]) last=a[p].x1+1; else { last=a[p].x2+1; vis[p]=1; pos[a[p].num]=coun; } } } printf("%d\n",coun); for(i=0;i<n;i++) printf("%d\n",pos[i]); } }
相关文章推荐
- XML方法一:组拼XML文件
- js绘制菱形(空心和实心)
- msvcp110d.dll 丢失问题解决
- 【NOIP模拟题】最大公约数
- React-Native ListView加载图片淡入淡出效果的组件
- Linux下php安装Redis扩展
- Shell grep 和正则
- while循环
- PHP写入txt文件
- Flex中怎么给表格中的滚动栏定位
- HTML中怎么设置图片的位置和大小
- Unity3D项目工程性能优化
- Codeforces Round #339 (Div. 2) D. Skills
- 利用FFmpeg生成视频缩略图 2.3.1
- Undefined symbols for architecture armv7错误解决方法
- Matlab判断正态分布性检验
- Android开发学习之路--Android Studio项目目录结构简介
- 安装Android adb驱动
- Android 中如何计算 App 的启动时间?
- Android开发学习之路--Android Studio项目目录结构简介