题目大意
假设银行有 N N N个窗口,窗口前有条黄线将等待的区域分成两个部分,顾客等待的规则如下:
- 每个窗口在黄线区域内最多能排 M M M个人
- 每个顾客会选择人数最少的那一列去排队,如果人数最少的队伍有多个,则去排窗口号最小的那个,每个顾客一旦排好队就不会改变
- C u s t o m e r i Customer_i Customeri会花费 T i T_i Ti分钟去处理业务
- 前
N
N
N个客户在
8:00
时开始处理业务
现在给了每个客户处理业务的时间,要求所给客户在什么时候处理完业务
输入
每组包含一个测试用例,每个用例第一行包含4个正整数:
N
N
N(
≤
20
\leq 20
≤20银行窗口的数量),
M
M
M(
≤
10
\leq 10
≤10黄线区域内每个窗口前能排的最大人数),
K
K
K(
≤
1000
\leq 1000
≤1000顾客的数量),
Q
Q
Q(
≤
1000
\leq 1000
≤1000所求顾客数量)
接下来一行包含
K
K
K个正整数,分别表示这
K
K
K个顾客处理业务的时间
最后一行包含
Q
Q
Q个正整数,分别表示
Q
i
Q_i
Qi号顾客在询问自己处理完业务的时间,顾客编号从
1
1
1~
K
K
K
输出
对所给的
Q
Q
Q个客户,在一行中输出他们每个人处理完业务的时间,格式为HH:MM
,HH
的范围在
[
08
,
17
]
,
[08,17],
[08,17],MM
的范围在
[
0
,
59
]
[0,59]
[0,59]。银行关门的时间是17:00
,如果顾客不能在17:00
之前处理业务,就输出Sorry
输入样例
2 2 7 5
1 2 6 4 3 534 2
3 4 5 6 7
输出样例
08:07
08:06
08:10
17:00
Sorry
解析
使用python的队列去模拟整个处理流程,python的队列可以用list来使用
class window:
def __init__(self):
self.firstTime = 0 #窗口第一个人处理完的时间
self.lastTime = 0 #窗口最后一个人处理完的时间
self.que = list() #窗口前的队列
def solve():
n, m, k, q = map(int, input().split())
time = list(map(int, input().split()))
windows = [window() for i in range(k)]
ans = [0 for i in range(k)]
pos = 0 #处理的顾客的编号
for i in range(m): #处理前M*N个顾客
for j in range(n):
if pos < k: #判断是否已经处理完所有顾客
windows[j].que.append(time[pos])
ans[pos] = (-1 if windows[j].lastTime >= 540 else windows[j].lastTime + time[pos])
#求这个顾客处理完的时间,如果他开始处理的时候就已经在17:00之后就设为-1
windows[j].lastTime += time[pos]
if i == 0:
windows[j].firstTime = windows[j].lastTime
pos += 1
while pos < k:
minWindow = 0
minTime = windows[minWindow].firstTime
for i in range(n): #找出所有窗口中最先处理完的那个
if minTime > windows[i].firstTime:
minTime = windows[i].firstTime
minWindow = i
windows[minWindow].que.pop(0)
windows[minWindow].firstTime += windows[minWindow].que[0]
windows[minWindow].que.append(time[pos])
ans[pos] = (-1 if windows[minWindow].lastTime >= 540 else windows[minWindow].lastTime + time[pos])
windows[minWindow].lastTime += time[pos]
pos += 1
lq = list(map(int, input().split()))
for i in range(q):
if ans[lq[i] - 1] == -1: #如果是-1则表示要输出Sorry
print("Sorry")
else:
print("%02d:%02d" % ((8 + ans[lq[i] - 1] // 60), ans[lq[i] - 1] % 60))
if __name__ == "__main__":
solve()