PTA甲级1014 快乐模拟 Waiting in Line
题目
大意:有N个窗口,每个窗口的黄线前可以排最多M个人。客户到银行时优先排在人数少的窗口前面,如果有多个窗口人数一样就排在序号小的窗口前。在下午5点前还没有开始服务的客户无法完成业务。求询问的客户完成业务的时间(无法完成输出sorry)。
代码:
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
const int maxnode = 1111;
int n,m,k,query,q;
int convermin(int h,int m){
return h*60+m;//将时间转化为分钟
}
struct window{
int endtime,poptime;
queue<int> q;//队列
}window[20];
int ans[maxnode],need[maxnode];//服务结束时间和服务需要时间
int main(){
int inIndex=0;//当前第一个为入队的编号
scanf("%d%d%d%d",&n,&m,&k,&query);
for(int i = 0;i < k;i++){
scanf("%d",&need[i]);
}
for(int i = 0;i < n;i++){//初始化每个窗口开始时间
window[i].poptime = window[i].endtime = convermin(8,0);
}
for(int i = 0;i < min(n*m,k);i++){
window[inIndex%n].q.push(inIndex);//更新窗口服务时间
window[inIndex%n].endtime += need[inIndex];
if(inIndex < n) window[inIndex].poptime = need[inIndex];//对窗口的第一个客户,更新poptime
ans[inIndex] = window[inIndex % n].endtime;
inIndex++;
}
for(;inIndex < k;inIndex++){//处理剩余客户入队
int idx = -1,minpoptime = 1<<30;//寻找所有窗口最小poptime
for(int i = 0;i < n;i++){
if(window[i].poptime < minpoptime){
idx = i;
minpoptime = window[i].poptime;
}
}
window[idx].q.pop();
window[idx].q.push(inIndex);
window[idx].endtime += need[inIndex];//更新该窗口队列的endtime
window[idx].poptime += need[window[idx].q.front()];//更新窗口的poptime
ans[inIndex] = window[idx].endtime;
}
for(int i = 0;i < query;i++){
scanf("%d",&q);//查询客户编号
if(ans[q-1]-need[q-1]>=convermin(17,0)){
printf("Sorry\n");
}else{
printf("%02d:%02d\n",ans[q-1]/60,ans[q-1]%60);
}
}
return 0;
}