比较复杂的模拟题。
#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; }