这个题读不明白题必定错,因为只到下午5点,所以直接一分一分的模拟,我感觉这样好理解不易写错.
有这几个注意点:
1、下午5点下班不是绝对的,若有人5点之前开始服务了,但是5点还没结束,那么这个人要被服务完,那这个人不输出sorry,我就是这错的.
2、若出去了一个人,那么来的人会找人最少的队伍,我的做法需要特殊的计算.这个需要注意.
#include <iostream>
#include <algorithm>
#include <string>
#include <map>
#include <set>
#include <vector>
#include <stack>
#include <queue>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cstring>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
struct people{
int no,spend,isServed;
people(){}
people(int _no,int _spend){
no=_no;
spend=_spend;
isServed=0;
}
};
int main(){
int n,m,k,q;
cin>>n>>m>>k>>q;
queue<people> time;
for(int i=0;i<k;i++){
int tmp;
cin>>tmp;
time.push(people(i,tmp));
}
queue<people> queues[30];
int idx=0;
for(int i=0;i<n*m&&time.size();i++){//这个过程是先把队填满 当然可能填不满
queues[idx].push(time.front());
time.pop();
idx++;
idx%=n;
}
int rec[1010]={0};
for(int i=0;i<1010;i++){
rec[i]=-1;
}
for(int i=1;i<=540;i++){//一分一分的模拟 模拟到下午5点
for(int j=0;j<n;j++){
if(queues[j].size()==0){
continue;
}
queues[j].front().isServed=1;
queues[j].front().spend--;
if(queues[j].front().spend==0){
people tmp=queues[j].front();
queues[j].pop();
rec[tmp.no]=i;
}
}
int flag=1;
while(flag){//找新进入人的队列
flag=0;
int minsize=999999999,idx1=0;
for(int j=0;j<n;j++){
if(queues[j].size()<minsize&&queues[j].size()<m){
minsize=queues[j].size();
idx1=j;
flag=1;
}
}
if(flag){
if(time.size()){
queues[idx1].push(time.front());
time.pop();
}
else{
break;
}
}
else{
break;
}
}
}
for(int i=0;i<n;i++){//这就是处理注意点1的
if(queues[i].front().isServed){
rec[queues[i].front().no]=540+queues[i].front().spend;
}
}
for(int i=0;i<q;i++){
int tmp;
cin>>tmp;
tmp--;
if(rec[tmp]==-1){
cout<<"Sorry"<<endl;
}
else{
int all=480+rec[tmp];
printf("%02d:%02d\n",all/60,all%60);
}
}
return 0;
}