又是花了好久的题…还是因为题目看太快和没有想充分就开始(最开始的时候Sorry的s忘记大写…弄得我怀疑人生)。
一开始没有get到他说的17点前开始的业务在17点后完成也依然不会输出sorry,以为17点银行就全部关门了,其实不是。好几个测试点都是考察了在17点后结束的情况。
修改过后最后一个点还是过不去很奇怪,但是根据之前几次类似的经历,修改了一下一个数组的大小就解决了,最后成功通过。
最后润色了一下,开始的时候把小时和分钟分开记录,多用了很多数组和很多行代码,特别冗杂,感觉自己挺傻的,现在改成了统一记录分钟(怪我没想充分就开始),虽然最后代码还是不够简洁,依然有一些重复部分,但应该还是比较易懂的。
#include<stdio.h>
int fastest(int WtimeH[20], int n);
int main(){
int n,m,k,q;
scanf("%d %d %d %d",&n,&m,&k,&q);
int i,w=0,hh,mm,pp=0,flag=1; //pp为正在排队的人
int Ptime[1000],Wtime[20]={0},time[1000]={0}; //每个人处理时间,窗口时间,每个人结束时间
int FWtime[20]={0}; //窗口第一个结束时间
int Stime[1000]={0}; //开始时间
struct{
int qq[11];
}queue[20];
int front[20],rear[20];
for(i=0; i<k; i++){
scanf("%d",&Ptime[i]);
}
for(pp=0; pp<n*m; pp++){ //先处理前n*m个
if(w>=n){
w=0;flag=0;
}
queue[w].qq[rear[w]]=pp; //记录队列中人的序号
rear[w]++;
Stime[pp]=Wtime[w];
Wtime[w]+=Ptime[pp];
if(flag){
FWtime[w]+=Ptime[pp];
}
time[pp]=Wtime[w];
w++;
}w=0;
while(pp<k){
w=fastest(FWtime, n); //最快的窗口
front[w]++;front[w]%=m;
FWtime[w]+=Ptime[queue[w].qq[front[w]]];
queue[w].qq[rear[w]]=pp;
rear[w]++;rear[w]%=m;
Stime[pp]=Wtime[w];
Wtime[w]+=Ptime[pp];
time[pp]=Wtime[w];
pp++;
}
for(i=0; i<q; i++){
scanf("%d",&pp);
pp-=1;
if(Stime[pp]>=540){
printf("Sorry\n");
}else{
printf("%02d:%02d\n",8+(time[pp]/60),time[pp]%60);
}
}
return 0;
}
int fastest(int FWtime[20], int n){
int i;
int t=999999;
int min;
for(i=0; i<n; i++){
if(FWtime[i]<t){
t=FWtime[i];
min=i;
}
}
return min;
}