这题思路倒是不难,比较容易想到是用queue进行模拟,主要是要想到对每个队列维护一个当前顾客进入的时间,我的模拟不咋样啊,这种题就感觉难度不小了。
#include<string>
#include<cstdlib>
#include<vector>
#include<stack>
#include<queue>
#include<utility>
#include<map>
#include<cstdlib>
#include<algorithm>
#include<functional>
#include<iostream>
#define INF 0x6fffffff
using namespace std;
int n, m, k, q;
queue<int> que[25];
int processTime[1050];
int leaveTime[1050]; //顾客离开的时间
int timeBase[25]; //每个窗口现在顾客进入的时间
int main() {
cin >> n >> m >> k >> q;
for (int i = 0; i < k; i++)
cin >> processTime[i];
int index;
int pos = 0; //目前在等待的顾客
for (int i = 0; pos < m*n&&pos<k; pos++) { //最开始顾客进入黄线
que[i].push(pos);
leaveTime[pos] = timeBase[i] + processTime[pos];
timeBase[i] = leaveTime[pos];
i = (i + 1) % n;
}
for (; pos < k; pos++) {
int min_wait = INF;
for (int j = 0; j < n; j++) {
int cus = que[j].front();
if (min_wait > leaveTime[cus]) {
min_wait = leaveTime[cus];
index = j;
}
}
que[index].pop();
que[index].push(pos);
leaveTime[pos] = timeBase[index] + processTime[pos];
timeBase[index] = leaveTime[pos];
}
int qq;
while (q--) {
cin >> qq;
qq--;
if (leaveTime[qq] - processTime[qq] >= 60 * 9) { //进入窗口时间不能大于等于17:00
cout << "Sorry" << endl;
}
else {
int hour = leaveTime[qq] / 60;
int minute = leaveTime[qq]% 60;
printf("%02d:%02d\n", 8 + hour, minute);
}
}
return 0;
}