思路:
时间换算成分钟,结构体是窗口
代码:
#include <bits/stdc++.h>
using namespace std;
int n, m, k, que, q;
int conv(int h, int m){//时间单位转换为分钟方便处理
return h*60+m;
}
struct win{
int endt, popt;//最后服务时间和开始结束时间
queue<int> q;
};
win w[20];
int ans[1111], need[1111];//结束和所需时间
int main()
{
int idx=0;//当前第一个未入队编号
cin>>n>>m>>k>>que;
for(int i=0;i<k;i++) cin>>need[i];
for(int i=0;i<n;i++) w[i].endt=w[i].popt=conv(8, 0);
for(int i=0;i<min(n*m,k);i++){//注意取容纳量和真实总数较小者
w[idx%n].q.push(idx);
w[idx%n].endt += need[idx];
if(idx<n) w[idx].popt = need[idx];//如果这是第一个则更新
ans[idx] = w[idx%n].endt;
idx++;//别忘了//是窗口和排队者序号分别更新
}
for(;idx<k;idx++){//如果有剩余
int idxw=-1, minpop=1<<30;
for(int i=0;i<n;i++)//寻找最快窗口
if(w[i].popt<minpop) idxw=i, minpop=w[i].popt;
w[idxw].q.pop();
w[idxw].q.push(idx);
w[idxw].endt += need[idx];
w[idxw].popt += need[w[idxw].q.front()];
ans[idx] = w[idxw].endt;
}
for(int i=0;i<que;i++){
cin>>q;
if(ans[q-1]-need[q-1]>=conv(17,0)) cout<<"Sorry"<<endl;
else printf("%02d:%02d\n",ans[q-1]/60,ans[q-1]%60);
}
return 0;
}