N 個窗口 (N≤20),每窗口黃線內最多排 M 人 (M≤10)。K 個顧客 (K≤1000) 依次到達,選最短隊列 (同長選號小)。前 N×M 人進入黃線內,其餘在黃線外等待。每人辦理時間 T[i]。求 Q 個查詢顧客的完成時間 (格式 HH:MM),超過 17:00 輸出 Sorry。
#include
#include
#include
using namespace std;
const int MAXK = 1005;
const int INF = 0x3f3f3f3f;
int T[MAXK], finish[MAXK];
queue q[25];
int window_free[25];
int main() {
int N, M, K, Q;
scanf("%d%d%d%d", &N, &M, &K, &Q);
for (int i = 0; i < K; i++) scanf("%d", &T[i]);
// 初始分配:前 N*M 人輪詢入隊 (等價於每次選最短隊列)
int idx = 0;
for (int i = 0; idx < K && i < M; i++) { // 分 M 輪
for (int w = 0; w < N && idx < K; w++) {
q[w].push(idx);
finish[idx] = window_free[w] + T[idx];
window_free[w] = finish[idx];
idx++;
}
}
// 處理剩餘顧客
for (; idx < K; idx++) {
// 找最早完成的窗口
int best_w = 0, min_finish = INF;
for (int w = 0; w < N; w++) {
if (!q[w].empty() && finish[q[w].front()] < min_finish) {
min_finish = finish[q[w].front()];
best_w = w;
}
}
q[best_w].pop();
q[best_w].push(idx);
finish[idx] = window_free[best_w] + T[idx];
window_free[best_w] = finish[idx];
}
// 回答查詢
while (Q--) {
int id; scanf("%d", &id); id--;
if (finish[id] - T[id] >= 540) puts("Sorry");
else {
int h = 8 + finish[id] / 60;
int m = finish[id] % 60;
printf("%02d:%02d\n", h, m);
}
}
return 0;
}