解题思路
- 先让
n
×
m
n\times m
n×m个数进入分界线内,但要判断一下人数,有
k
<
n
×
m
k<n\times m
k<n×m 和
k
>
=
n
×
m
k>=n\times m
k>=n×m 两种情况
- 结构体存入三个数据:
- 队首出队时间
- 最后结束时间
- 一个队列
- 这样处理的话,后面就可以通过遍历找到每个窗口的队首处理时间,找到最小值,一个一个插入到对应的窗口中。
- 注意如果在17:00之前还没进入排队,就say Sorry。但是你处理完时间超过17:00还是OK的
code
#include <bits/stdc++.h>
using namespace std;
struct node{
int fir=8*60,end=8*60;
queue<int> q;
};
int main(){
int n,m,k,q,x,index=1;
cin>>n>>m>>k>>q;
node win[n+1];
vector<int> judge(k+1,0),ans(k+1,0);
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++){
if(index<=k){
cin>>x;
win[j].q.push(x);
if(win[j].end>=17*60) judge[index]=1;
win[j].end+=x;
if(i==1) win[j].fir=win[j].end;
ans[index++]=win[j].end;
}
}
while(index<=k){
cin>>x;
int minw=1,mint=win[1].fir;
for(int i=2;i<=n;i++)
if(win[i].fir<mint){
mint=win[i].fir;
minw=i;
}
win[minw].q.pop();
win[minw].q.push(x);
if(win[minw].end>=17*60) judge[index]=1;
win[minw].end+=x;
win[minw].fir+=win[minw].q.front();
ans[index++]=win[minw].end;
}
for(int i=1;i<=q;i++){
cin>>x;
judge[x]?printf("Sorry\n"):printf("%02d:%02d\n",ans[x]/60,ans[x]%60);
}
return 0;
}