这题思路倒是不难,比较容易想到是用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:00cout << "Sorry" << endl;}else {int hour = leaveTime[qq] / 60;int minute = leaveTime[qq]% 60;printf("%02d:%02d\n", 8 + hour, minute);}}return 0;
}