create the queue model with circular queues.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | #include <cstdio> #define MAX 11 int n,m,k,q; int now,t[1001],end[1001]; int next; typedef struct{ int data[MAX]; int front,rear; int len; }queue; queue que[21]; void addq(queue &q,int i){ q.data[q.rear]=i; q.rear=(q.rear+1)%MAX; q.len++; } void deq(queue &q){ q.front=(q.front+1)%MAX; q.len--; } int main(){ scanf("%d%d%d%d",&n,&m,&k,&q); for(int i=1;i<=k;i++) scanf("%d",&t[i]); now=0; next=1; for(int i=1;i<=n;i++){ que[i].rear=que[i].front=0; que[i].len=0; } while(next<=n*m && next<=k){ addq(que[(next-1)%n+1],next); next++; } bool empty=false; while(!empty){ int min=10000; empty=true; for(int i=1;i<=n;i++) if(que[i].len){ empty=false; int num=que[i].data[que[i].front]; if(t[num]<min) min=t[num]; } if(!empty) now+=min; for(int i=1;i<=n;i++) if(que[i].len){ int num=que[i].data[que[i].front]; t[num]-=min; if(!t[num]){ end[num]=now; deq(que[i]); if(now>=540) while(que[i].len){ num=que[i].data[que[i].front]; end[num]=-1; deq(que[i]); } if(next<=k && now<540) addq(que[i],next++); } } } while(next<=k) end[next++]=-1; for(int i=1;i<=q;i++){ int a; scanf("%d",&a); if(end[a]<0) printf("Sorry\n"); else printf("%02d:%02d\n",8+end[a]/60,end[a]%60); } return 0; } |