pat1014Waiting in Line (30)
2015-10-02 20:33
351 查看
题意分析:
(1)本题模拟银行排队,逻辑上不难,操作起来有点麻烦。银行来了K个客户,银行有N个窗口,每个窗口前有M个位置排队,客户选择最短的队伍排,根据每个客户的序号和服务时间来确定最后客户离开银行的时间。
(2)属于队列的问题,但实际上可以将问题简化:因为每个客户的服务时间是固定的,假设前N*M个客户达到之后排好位置后,他们的离开时间也就确定好了,即每个窗口本次服务结束的时间也就确定了,比如第一个人的服务时间是5min,则本次窗口的服务结束时间点是8:05,这样我们就可以比较这N个窗口当前服务结束的时间点,谁最早结束,谁的队伍最短,在线外等候的第N*M+1个客户选择这个队伍排,以此类推。
(3)每个客户离开的时间等于他前面一个人的离开时间加上他自己的服务时间,于是定义每个队列中的值是前一个值加上这个人的服务时间
(4)为了计算方便,将时间的基点设为0,算出的结果是在银行停留的时间(以分钟计算),最后再换算成小时+8
可能坑点:
(1)这是个大深坑,必须要保证当一个人等待时间大于或等于540分钟的时候,就不能服务了,而不是等待时间加上他的服务时间,言外之意就是,一旦这个人在540分钟之内获得服务,那么无论这个人的服务时间有多长,也要为他服务完,这也是符合实际的。
(1)本题模拟银行排队,逻辑上不难,操作起来有点麻烦。银行来了K个客户,银行有N个窗口,每个窗口前有M个位置排队,客户选择最短的队伍排,根据每个客户的序号和服务时间来确定最后客户离开银行的时间。
(2)属于队列的问题,但实际上可以将问题简化:因为每个客户的服务时间是固定的,假设前N*M个客户达到之后排好位置后,他们的离开时间也就确定好了,即每个窗口本次服务结束的时间也就确定了,比如第一个人的服务时间是5min,则本次窗口的服务结束时间点是8:05,这样我们就可以比较这N个窗口当前服务结束的时间点,谁最早结束,谁的队伍最短,在线外等候的第N*M+1个客户选择这个队伍排,以此类推。
(3)每个客户离开的时间等于他前面一个人的离开时间加上他自己的服务时间,于是定义每个队列中的值是前一个值加上这个人的服务时间
(4)为了计算方便,将时间的基点设为0,算出的结果是在银行停留的时间(以分钟计算),最后再换算成小时+8
可能坑点:
(1)这是个大深坑,必须要保证当一个人等待时间大于或等于540分钟的时候,就不能服务了,而不是等待时间加上他的服务时间,言外之意就是,一旦这个人在540分钟之内获得服务,那么无论这个人的服务时间有多长,也要为他服务完,这也是符合实际的。
#include <iostream> #include <queue> #include <string.h> #include <limits.h> #include <iomanip> using namespace std; int waittingTime[1005]; int servedTime[1005]; int main() { int N,M,K,Q; cin>>N>>M>>K>>Q; queue<int >qu ; memset(waittingTime,0,sizeof(waittingTime)); memset(servedTime,0,sizeof(servedTime)); int i=0; while(i<K) { cin>>waittingTime[i]; servedTime[i]=waittingTime[i]; if(i<N*M) { if(!qu[i%N].empty())waittingTime[i]+=qu[i%N].back(); qu[i%N].push(waittingTime[i]); } i++; } if(K>N*M) { for(int j=N*M;j<K;j++) { int min=INT_MAX; int index; for(int k=0;k<N;k++) { if(qu[k].front()<min) { min=qu[k].front(); index=k; } } waittingTime[j]+=qu[index].back(); qu[index].push(waittingTime[j]); qu[index].pop(); } } int j=0; int query; while(j<Q) { cin>>query; query--; //这是个大深坑,必须要保证当一个人等待时间大于或等于540分钟的时候,就不能服务了, //而不是等待时间加上他的服务时间,言外之意就是,一旦这个人在540分钟之内获得服务,那么无论这个人的 //服务时间有多长,也要为他服务完,这也是符合实际的 if(waittingTime[query]-servedTime[query]>=540)cout<<"Sorry"<<endl; else { int hh=8+waittingTime[query]/60; int mm=waittingTime[query]%60; cout<<setw(2)<<setfill('0')<<hh<<":"<< setw(2)<<setfill('0')<<mm<<endl; } j++; } return 0; }
相关文章推荐
- 智能机器人“小昆”的实现(五)MainActivty的实现及项目结束
- Aizu 2450 Do use segment tree (树链剖分)
- LightOJ 1138 Trailing Zeroes (III)
- 11i - 12 Gather Schema Statistics fails with Ora-20001 errors after 11G database Upgrade (文档 ID 781813.1)
- Hdu 4681 2013 Multi-University Training Contest 8 String
- http://wenku.baidu.com/link?url=UGoPtZviipHzi5SDIlGx6hPFWAHTPLFXcZ7ieD15JMd81DEHqjehvphVMhqELmOK4qXR74dTT9nW8VBoApBc7Kfb1ZWrNF_i24fY1YRHVki
- Aizu 2456 Usoperanto (贪心)
- UVa 11853 PaintBall
- 在linux进程中的信号屏蔽 http://blog.csdn.net/fjb2080/article/details/5174306
- vfork http://blog.csdn.net/tennysonsky/article/details/45847107
- Light oj 1038 - Race to 1 Again(概率dp)
- Tail call optimization in Scala
- 信号量sem_wait()的使用
- 关于信号量sem_wait的整理(转)
- system()函数 http://blog.csdn.net/ghevinn/article/details/7916126
- waitpid系统调用在Linux函数库中的原型是:http://blog.sina.com.cn/s/blog_602a39250100xfxx.html
- poj2305-Basic remains(进制转换 + 大整数取模)
- HDU 1702 ACboy needs your help again!(栈和队列)
- poj 1995 Raising Modulo Numbers【快速幂】
- 解决:CWnd::SetWindowText报Assertion failure