1014 Waiting in Line (30分)
分析
按照时间遍历,记录每位顾客的结束时间即可
代码
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int n, m, k, q, a;
vector<int> f, service_time;
vector<vector<pair<int,int> > >w;//窗口,记录当前服务的顾客及其剩余服务时间
queue<pair<int,int> > que;//在排队而未进入窗口前排队的顾客
int main() {
scanf("%d %d %d %d", &n, &m, &k, &q);
f.resize(k + 1);
service_time.resize(k + 1);
for (int i = 1; i <= k; ++i) {
scanf("%d", &a);
service_time[i] = a;
que.push(pair<int, int>(i, a));
}
w.resize(n);
//按分钟记录服务过程,并记录每位顾客的结束时间
for (int i = 0; i <= 540; ++i) {
//对每一个非空的窗口前的顾客的剩余服务时间做-1操作,并将剩余服务时间为0的顾客从窗口前删除并保存期结束时间
for (int j = 0; j < n; ++j) {
if (!w[j].empty()) {
w[j][0].second -= 1;
if (w[j][0].second == 0) {
f[w[j][0].first] = i;
w[j].erase(w[j].begin());
}
}
}
//将正在排队等待的顾客放到序号最小且排队人数最少的窗口前的队列中
while (true && !que.empty()) {
int mc = m + 1, id;
for (int j = 0; j < n; ++j)
if (mc > w[j].size()) {
mc = w[j].size();
id = j;
}
if (mc == m)break;
w[id].push_back(que.front());
que.pop();
}
}
//将下班后还在窗口前接受服务的顾客的结束时间计算并保存
for (int i = 0; i < n; ++i)
if (!w[i].empty()) {
f[w[i][0].first] = 540 + w[i][0].second;
}
for (int i = 0; i < q; ++i) {
scanf("%d", &a);
if (f[a] == 0 || f[a] - 540 == service_time[a]) printf("Sorry\n");
else
printf("%02d:%02d\n", 8 + f[a] / 60, f[a] % 60);
}
return 0;
}