比较复杂的模拟题。
#include<stdio.h>
#include<iostream>
#include<queue>
using namespace std;
typedef struct PNode{
int outhour,outminute;
}Person;
typedef struct WNode{
vector<int> pv;
}Window;
int main(){
int i,j;
int N,M,K,Q;
int stime[1005];
Person person[1005];
Window window[22];
scanf("%d %d %d %d",&N,&M,&K,&Q);
for(i=1;i<=K;i++){
scanf("%d",&stime[i]);
}
for(i=1;i<=K;i++){
int maxperson=M;
int minindex=N;
int maxhour=-1;
int maxminute=61;
int mindex=N;
for(j=N;j>=1;j--){
if(window[j].pv.size()<=maxperson){
maxperson=window[j].pv.size();
minindex=j;
}
int wsize=window[j].pv.size();
if(wsize){
int pid=window[j].pv.front();
if(maxhour==-1||(person[pid].outhour<maxhour)||((person[pid].outhour==maxhour)&&(person[pid].outminute<=maxminute))){
maxhour=person[pid].outhour;
maxminute=person[pid].outminute;
mindex=j;
}
}
}
if(maxperson<M){
if(window[minindex].pv.size()){
int pid=window[minindex].pv.back();
person[i].outminute=(person[pid].outminute+stime[i]%60)%60;
person[i].outhour=person[pid].outhour+stime[i]/60+(stime[i]%60+person[pid].outminute)/60;
}
else{
person[i].outminute=(0+stime[i]%60)%60;
person[i].outhour=8+stime[i]/60+(stime[i]%60+0)/60;
}
window[minindex].pv.push_back(i);
}
else{
int pid=window[mindex].pv.back();
person[i].outminute=(person[pid].outminute+stime[i]%60)%60;
person[i].outhour=person[pid].outhour+stime[i]/60+(stime[i]%60+person[pid].outminute)/60;
window[mindex].pv.push_back(i);
window[mindex].pv.erase(window[mindex].pv.begin());
}
}
int qtmp;
for(i=0;i<Q;i++){
scanf("%d",&qtmp);
/*notice that customers can be served before 17:00*/
int ttmp=(person[qtmp].outhour-8)*60+person[qtmp].outminute-stime[qtmp];
if(ttmp<540)
printf("%02d:%02d\n",person[qtmp].outhour,person[qtmp].outminute);
else
printf("Sorry\n");
}
return 0;
}