#include <cstdio>
#include <algorithm>
struct Customer{ int ptime;
//int w;//窗口号
int ot;//结束时间
int st;//开始服务时间
Customer() { ot=0; }
}
cus[1001];struct Window{
int c;//黄线内的顾客数
int etime[21];//窗口结束服务的时间}win[21];
int main(){ int n,m,k,q;
scanf("%d%d%d%d",&n,&m,&k,&q);
int i,j,s;
for(i=1;i<k+1;i++) { scanf("%d",&cus[i].ptime); }
int f=0; //初始化完成
for(i=0;i<22;i++) { win[i].c=0; for(j=0;j<22;j++) win[i].etime[j]=480; }
int shutt=17*60,minend,pos,minc;
for(i=1;i<k+1;i++)
{ minc=m; minend=1000000; pos=-1;
for(j=1;j<n+1;j++)
{ if(win[j].c < minc)
{ minc=win[j].c;//查看当前队列是否已经排满并且找出人数最少的那个窗口并记录
pos=j;
}
}
if(minc < m)//如果没有排满,就直接排到人数最少的队列后面
{ win[pos].etime[minc+1] = win[pos].etime[minc]+cus[i].ptime;//更新新入队的成员的服务结束时间
cus[i].st=win[pos].etime[minc];//新入队的成员的开始服务时间是上一个成员的服务结束时间
cus[i].ot = win[pos].etime[minc+1];//结束时间是开始服务时间加上处理时间
win[pos].c++;//当前窗口排队的人数增加 }
else//如果队伍排满
{ for(j=1;j<n+1;j++)//找到队列正在服务的成员最先结束服务的那个窗口
{
if(minend > win[j].etime[1])
{ minend=win[j].etime[1]; pos=j; }
}
for(s=1;s<m;s++)
{ win[pos].etime[s] = win[pos].etime[s+1];//队首服务结束后,后面的成员向后移
} //把当前的顾客加入到此队列中
cus[i].st = win[pos].etime[m];//存储开始服务时间为上一个服务结束的时间
win[pos].etime[m] = win[pos].etime[m]+cus[i].ptime;//更新当前队列最后一个结束时间
cus[i].ot = win[pos].etime[m];//结束时间为开始时间加上处理时间
win[pos].c=m; } }
int t=0; for(j=1;j<q+1;j++) {
scanf("%d",&t);
if(cus[t].st < shutt)
printf("%02d:%02d\n",cus[t].ot / 60,cus[t].ot % 60);
else printf("Sorry\n"); }
return 0;
}
#include <algorithm>
struct Customer{ int ptime;
//int w;//窗口号
int ot;//结束时间
int st;//开始服务时间
Customer() { ot=0; }
}
cus[1001];struct Window{
int c;//黄线内的顾客数
int etime[21];//窗口结束服务的时间}win[21];
int main(){ int n,m,k,q;
scanf("%d%d%d%d",&n,&m,&k,&q);
int i,j,s;
for(i=1;i<k+1;i++) { scanf("%d",&cus[i].ptime); }
int f=0; //初始化完成
for(i=0;i<22;i++) { win[i].c=0; for(j=0;j<22;j++) win[i].etime[j]=480; }
int shutt=17*60,minend,pos,minc;
for(i=1;i<k+1;i++)
{ minc=m; minend=1000000; pos=-1;
for(j=1;j<n+1;j++)
{ if(win[j].c < minc)
{ minc=win[j].c;//查看当前队列是否已经排满并且找出人数最少的那个窗口并记录
pos=j;
}
}
if(minc < m)//如果没有排满,就直接排到人数最少的队列后面
{ win[pos].etime[minc+1] = win[pos].etime[minc]+cus[i].ptime;//更新新入队的成员的服务结束时间
cus[i].st=win[pos].etime[minc];//新入队的成员的开始服务时间是上一个成员的服务结束时间
cus[i].ot = win[pos].etime[minc+1];//结束时间是开始服务时间加上处理时间
win[pos].c++;//当前窗口排队的人数增加 }
else//如果队伍排满
{ for(j=1;j<n+1;j++)//找到队列正在服务的成员最先结束服务的那个窗口
{
if(minend > win[j].etime[1])
{ minend=win[j].etime[1]; pos=j; }
}
for(s=1;s<m;s++)
{ win[pos].etime[s] = win[pos].etime[s+1];//队首服务结束后,后面的成员向后移
} //把当前的顾客加入到此队列中
cus[i].st = win[pos].etime[m];//存储开始服务时间为上一个服务结束的时间
win[pos].etime[m] = win[pos].etime[m]+cus[i].ptime;//更新当前队列最后一个结束时间
cus[i].ot = win[pos].etime[m];//结束时间为开始时间加上处理时间
win[pos].c=m; } }
int t=0; for(j=1;j<q+1;j++) {
scanf("%d",&t);
if(cus[t].st < shutt)
printf("%02d:%02d\n",cus[t].ot / 60,cus[t].ot % 60);
else printf("Sorry\n"); }
return 0;
}