#include<iostream>
#include<string>
#include<map>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
int n,m,k,q;
int ptime[1010];
int stime1=0,speo=0,pwtime[1010];// 记录总共的时间
void OUT(int a){
printf("%02d:%02d\n",8+a/60,a%60);
}
int main(){
scanf("%d %d %d %d",&n,&m,&k,&q);
for(int i=0;i<k;i++)
scanf("%d",&ptime[i]);
vector<int> window[22];
int wintime[22];//每个窗口正在办理业务的人,还需要多久才能完成
int peo=0;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
if(peo<n*m&&peo<k)
window[j].push_back(peo++);//这里我把预先要安排的人搞定了
while(peo<n){
window[peo++].push_back(-1);
}
for(int i=0;i<n&&i<k;i++)
if(*window[i].begin()==-1)
wintime[i]=999999;
else
wintime[i]=ptime[*window[i].begin()];
int lastmin=0,lastwin=-1;
while(speo<k){
for(int i=0;i<n&&i<k;i++)
if(*window[i].begin()==-1)
wintime[i]=999999;
else if(i==lastwin)
wintime[i]=ptime[*window[i].begin()];
else
wintime[i]=wintime[i]-lastmin;
int min=99999,min_win;
for(int i=0;i<n&&i<k;i++){
if(wintime[i]<min){
min=wintime[i];
min_win=i;//找出最小的,然后记录最小的窗口号;
}
}
stime1+=min;
pwtime[*window[min_win].begin()]=stime1;
window[min_win].erase(window[min_win].begin());//删除了这个已经出去了的元素
if(peo<k)
window[min_win].push_back(peo++);
else
window[min_win].push_back(-1);//再来添加一个后面的元素,如果后面没有元素了,那就加个-1做记录
lastwin=min_win;
lastmin=min;//做个记录 s
speo++;
}
for(int i=0;i<q;i++){
int temp;
scanf("%d",&temp);
if(pwtime[temp-1]-ptime[temp-1]<540)//在结束前还在办理业务的人还是要继续办理的
OUT(pwtime[temp-1]);
else
printf("Sorry\n");
}
return 0;
}
PAT1014,莫名其妙就做出来,一定要记录下
猜你喜欢
转载自blog.csdn.net/qq_34701632/article/details/86295452
今日推荐
周排行