方法:模拟
分为三个部分:1,将顾客放满等待区;2,模拟顾客进入等待区;3,最后一批顾客的时间处理,即17:00之前必须到达窗口的队首。
注意点:1,17:00之前未到达窗口队首的情况;2,17:00之前到达窗口队首,但服务时间超过17:00。
#include <iostream>
#include <queue>
using namespace std;
int numw,numl,numc,numq; //分别是窗口数,单个窗口的队伍长度,顾客数,查询数
int service[1010]={0};
int query[1010]={0};
int main(){
scanf("%d%d%d%d",&numw,&numl,&numc,&numq);
queue<int> window[numw+1];
for(int i=1;i<=numc;i++){
scanf("%d",&service[i]);
}
int now;
for(int order=0;order<numl;order++){ //该循环判断条件是order<numl
for(int i=1;i<=numw;i++){ //窗口的序号从1到n
now=i+order*numw;
if(now<=numc){
window[i].push(now);
}else{
now--;
//保证顾客数在够与不够window*line的 两种情况下,now都指向最后一个处于排队取的客户
break;
}
}
}
now++;
int T=(17-8)*60;
while(T--){
for(int i=1;i<=numw;i++){
if(window[i].size()>0) service[window[i].front()]--;
else continue;
if(service[window[i].front()]==0){
query[window[i].front()]=9*60-T;
window[i].pop();
if(now<=numc){
window[i].push(now);
now++;
}
}
}
if(T==1){
for(int i=1;i<=numw;i++){
if(window[i].size()>0){
query[window[i].front()]=service[window[i].front()]+9*60-T;
}
}
break;
}//到时间16;59时
}//while循环,模拟客户切换的过程
for(int i=0;i<numq;i++){
int temp;
scanf("%d",&temp);
if(query[temp]==0) printf("Sorry\n");
else printf("%02d:%02d\n",query[temp]/60+8,query[temp]%60);
}
return 0;
}