pat 1014
来源:互联网 发布:unity3d 仿真 编辑:程序博客网 时间:2024/04/27 03:32
题意:大概是说银行的队伍分黄线前和黄先后两种,黄线前有n个柜台,每个柜台可以排m个人,黄先后只站一排,最前面的人总是会站到黄线前人最少且序号尽量小的队伍中去,银行早上8点开门,17点关门,已知每个用户办理业务所需的时间,求每个用户何时能办完业务,如果一个用户的业务在17点之前还没开始就输出sorry
思路:思路还是比较清晰的,我们可以很容易的知道前n*m个人,会横向站到黄线前的队伍中去,所以他们的时间都可以容易的求出来,主要问题是黄线后的人,很明显,他始终站到黄线前第一个走的人的队伍中(同时的话序号最小),所以我们对黄线前的所有用户建一个优先队列,这样每次队首元素所在的队伍序号就是黄先后第一个人回去的队伍,这样只要每次记录每个队伍所有人业务结束的时间,就可以知道下一个人在什么时候结束业务,注意记录sorry的情况
代码:
#include<cstdio>#include<cstring>#include<algorithm>#include<queue>using namespace std;struct PP{int time,id;};struct QQ{bool operator() (const PP &a,const PP &b) const{if(a.time==b.time) return a.id>b.id;return a.time>b.time;}};priority_queue<PP,vector<PP>,QQ> Q;int n,m,k,q;int T[1005],pro[1005],ans[1005];bool mark[1005];int main(){int i,j,temp=-1;memset(mark,false,sizeof(mark));scanf("%d%d%d%d",&n,&m,&k,&q);for(i=0;i<k;i++)scanf("%d",&T[i]);for(i=0;i<n;i++) pro[i]=8*60;for(i=0;i<m;i++){for(j=0;j<n;j++) {temp++;if(temp>=k) break;PP New;if(pro[j]>=17*60) mark[temp]=1;pro[j]+=T[temp];ans[temp]=pro[j]; New.time=pro[j];New.id=j;Q.push(New);}}while(temp++<k){PP t=Q.top();Q.pop();if(pro[t.id]>=17*60) mark[temp]=1;pro[t.id]+=T[temp];ans[temp]=pro[t.id];PP New;New.id=t.id;New.time=pro[t.id];Q.push(New);}for(i=0;i<q;i++){int a;scanf("%d",&a);a--;if(!mark[a])printf("%02d:%02d\n",ans[a]/60,ans[a]%60);else puts("Sorry");}return 0;}
0 0
- Pat 1014
- PAT 1014
- PAT 1014
- pat 1014
- pat: 1014,部分错误
- PAT(A) 1014
- zju-pat 1014
- PAT(甲级)1014
- PAT Advanced 1014
- PAT乙级1014
- pat-bl-1014
- PAT乙级1014
- PAT甲级1014
- PAT甲级1014
- PAT甲级 1014
- PAT(乙级)1014
- 浙大PAT甲级-1014
- PAT basic 1014
- Android Paint和Color类
- 【java高级特性之反射】创建Class对象的三种方法
- C++ 学习笔记_0017_数组(成绩处理)
- 关于如何判断在平面上的两条线段是否相交
- hdu2896 病毒侵袭 AC自动机入门题
- pat 1014
- ASP工程文件(csproj)解读
- C#设计模式之命令模式
- SQL 高级语句
- ORACLE 数据文件大小
- java中几种集合的介绍
- 安卓学习笔记:1:用自定义View
- "ORA-00942: 表或视图不存在 "的原因和解决方法
- hdu3065 病毒侵袭持续中 AC自动机入门