题目描述
K个人来银行排队办理业务,银行有n个窗口可以同时办理,每个窗口允许有m个人排队,其余的人在银行大厅等待。当某个窗口排队人数少于m时,在大厅等待的人可进入该窗口排队。每个人都有自己要办的业务,每个业务要花费一定的时间,银行的上班时间是早上8点到下午17点,若开始办理业务的时间大于等于17点,就无法办理相关的业务了。
有q次查询,查询q个顾客办理业务结束时的时间。对于无法办理相关业务的查询,输出sorry。
假设第一位顾客从早上8点开始办理业务,k个顾客编号依次为: 1、2…k。
输入格式
共3行:
第一行4个由空格分隔的正整数,分别表示n,m,k,q
第二行为k个由空格分隔的正整数,分别表示每个人办理业务所需时间
第三行为q个由空格分隔的正整数,分别表示每次查询时要查询的顾客编号
输出格式
共q行,对应每次查询的结果,每个结果的格式为: hh:mm
输入输出样例
说明
该银行共有两个窗口,每个窗口可同时供2人排队,总共有7人需要办理业务,有5次询问,分别是编号为3、4、5、6、7 的顾客结束时间;输出结果显示编号为 3 的顾客在 08:07 分结束,编号为 4 的顾客在 08:06 分结束,编号为 5 的顾客在 08:10 分结束,编号为 6 的顾客在 17:00 分结束,编号为 7 的顾客在开始办理业务前,银行就下班了,所以输出 sorry。
数据范围:
1<=n<=10 1<=m<=5 1<=k, q<=100
补充说明:只要顾客在下班前开始办理业务,那就要将其办理完,因此,查询输出的结束时间有可能超过 17:00。
【耗时限制】1000ms 【内存限制】128MB
AC代码:
#include <bits/stdc++.h>
using namespace std;
const long long INF = INT_MAX;
queue<long long> q[110];
long long t[110];
long long e[110];
queue<long long> win[110];
int main() {
long long n, m, k, q, id;
cin >> n >> m >> k >> q;
for (long long i = 1; i <= k; i++) {
cin >> t[i];
}
long long now = 1;
for (long long i = 1; i <= min(n * m, k); i++) {
if (win[now].empty()) e[i] = t[i];
else e[i] = win[now].back() + t[i];
win[now].push(e[i]);
now++;
if (now > n) now = 1;
}
for (long long i = n * m + 1; i <= k; i++) {
long long minn = INF, pos;
for (long long j = 1; j <= n; j++) {
if (win[j].front() < minn) {
minn = win[j].front();
pos = j;
}
}
e[i] = win[pos].back() + t[i];
win[pos].pop();
win[pos].push(e[i]);
}
while (q--) {
cin >> id;
long long et = e[id] + 8 * 60;
long long st = et - t[id];
if (st >= 17 * 60) {
cout << "sorry" << endl;
}
else {
printf("%02lld:%02lld\n", et / 60, et % 60);
}
}
return 0;
}