题解
排队模拟。需要注意的是,如果一个人在17:00及以后还没有开始服务,这种情况才输出“Sorry”。一个人在17:00之前已经开始了服务,就算结束服务在17:00之后,这样也是没问题的。
代码
#include<bits/stdc++.h> using namespace std; const int inf = 0x7fffffff; struct node { int num,finish_time; queue<int> people; }windows[25]; bool cmp_quesize(node x,node y) { if(x.people.size()!=y.people.size()) return x.people.size()<y.people.size(); else return x.num<y.num; } bool cmp_finish(node x,node y) { if(x.finish_time!=y.finish_time) return x.finish_time<y.finish_time; else return x.num<y.num; } int N,M,K,Q,service_time[1005],servicing,ans[1005]; void POP(); void PUSH(int p); void print(int p); int main() { int i,q; scanf("%d%d%d%d",&N,&M,&K,&Q); for(i=1;i<=K;i++) scanf("%d",&service_time[i]); for(i=1;i<=N;i++) windows[i].num=i,windows[i].finish_time=inf; for(i=1;i<=K;i++) { if(servicing==N*M) POP(); PUSH(i); } while(servicing) POP(); for(i=0;i<Q;i++) { scanf("%d",&q); print(q); } system("pause"); return 0; } void print(int p) { int sum=8*60+ans[p]; if(ans[p]-service_time[p]>=540) printf("Sorry\n"); else printf("%02d:%02d\n",sum/60,sum%60); } void PUSH(int p) { servicing++; sort(windows+1,windows+N+1,cmp_quesize); windows[1].people.push(p); if(windows[1].finish_time==inf) windows[1].finish_time=service_time[p]; } void POP() { int one,two=0; servicing--; sort(windows+1,windows+N+1,cmp_finish); one=windows[1].people.front(); windows[1].people.pop(); ans[one]=windows[1].finish_time; if(!windows[1].people.empty()) { two=windows[1].people.front(); windows[1].finish_time+=service_time[two]; } else windows[1].finish_time=inf; }
原文地址:https://www.cnblogs.com/VividBinGo/p/12237301.html
时间: 2024-10-10 09:55:46