#include<bits/stdc++.h>
using namespace std;
int n,m,k,q;
typedef struct ss {
int h,m,t;
} ss;
ss a[1004];
int b[1004],N;
vector< vector<int> > Q(20);
void del(int i) {//客户完成办理计算时间,并在办理数组中删除当前客户
a[Q[i][0]].m+=N+a[Q[i][0]].t;
a[Q[i][0]].h+=a[Q[i][0]].m/60;
a[Q[i][0]].m%=60;
Q[i].erase(Q[i].begin());
}
void Del(int M) {
N+=a[Q[M][0]].t;
for(int j=0; j<n; j++)
if(j-M&&Q[j].size())
a[Q[j][0]].t-=a[Q[M][0]].t;//为其他窗口的客户减掉当前结束客户的时间
a[Q[M][0]].t=0;
if(N>=540)//判断当前最快结束的客户结束时是否超过限制时间
for(int j=0; j<n; j++)
if(j-M&&Q[j].size())
del(j);
del(M);
}
void late() {//未能在限制时间内开始办理的客户一律按照超时计算
for(int i=0; i<n; i++)
for(int j=0; j<Q[i].size(); j++)
a[Q[i][j]].h=18;
}
int main() {
scanf("%d %d %d %d",&n,&m,&k,&q);
m;
int p=0;
N=0;
for(int i=1; i<=k; i++) {
scanf("%d",&a[i].t);
if(N<540) {
a[i].m=0;
a[i].h=8;
int M=-1;
if(Q[p].size()==m) {//当Q数组长度达到m时开始判断和删除Q数组最早结束的客户,并在该客户的数组中添加下一个客户数据
for(int j=0; j<n; j++)
if(M<0||a[Q[M][0]].t>a[Q[j][0]].t)
M=j;
Del(M);
p=M;
}
Q[p++].push_back(i);
p%=n;
if(N>=540)
late();
} else
a[i].h=18;
}
int T;
while(N<540) {
T=1;
int M=-1;
for(int j=0; j<n; j++)
if(Q[j].size()&&(M<0||a[Q[M][0]].t>a[Q[j][0]].t)) {
M=j;
T=0;
}
if(T)
break;
Del(M);
if(N>=540)
late();
}
for(int i=0; i<q; i++) {
int x;
cin>>x;
if(a[x].h<=17)
printf("%02d:%02d\n",a[x].h,a[x].m);
else
printf("Sorry\n");
}
return 0;
}
1014 Waiting in Line
最新推荐文章于 2024-09-13 17:43:09 发布