题意:
n个窗口,每个窗口前可以排队m人。 有k位用户需要服务,给出了每位用户服务需要占用的的minute数。 银行在8点开始服务,如果有窗口还没排满就在窗口前排队,否则就在黄线外等候。如果有某一队列有一个用户走了服务完毕了,黄线外的人就进来一个。如果同时有多个窗口走了一个人,就选窗口数最小的那个窗口前去排队。 要求输入q个人,以HH:mm的格式输出他们的服务结束时间。银行在17:00点停止服务,如果一个客户在17:00以及以后还没有开始服务(此处不是结束服务是开始17:00)就输出Sorry。
思路: 参考
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m,k,q;
struct node{
int open,close,cost;
}c[1100];
queue<node>w[1001];
int main(){
cin>>n>>m>>k>>q;
int open=8*60,close=17*60;
for(int i=1;i<=k;i++) cin>>c[i].cost;
for(int i=1;i<=k;i++){
if(i<=n*m){
int now=(i-1)%n+1;
if(i<=n){
c[i].open=open;
c[i].close=open+c[i].cost;
}
else{
node las=w[now].back();
c[i].open=las.close;
c[i].close=c[i].open+c[i].cost;
}
w[now].push(c[i]);
}
else{
int now=1;
for(int j=2;j<=n;j++)
if(w[j].front().close<w[now].front().close) now=j;
w[now].pop();
node las=w[now].back();
c[i].open=las.close;
c[i].close=c[i].open+c[i].cost;
w[now].push(c[i]);
}
}
while(q--){
int x;cin>>x;
if(c[x].open>=close) puts("Sorry");
else printf("%02d:%02d\n",c[x].close/60,c[x].close%60);
}
return 0;
}
|