class Solution:
def busiestServers(self, k: int, arrival: List[int], load: List[int]) -> List[int]:
"""
k server
each server 1 req / time
for req[i]:
(1) if len(avail) <1 : req.drop()
(2) if (i%k) server available, assign req
else:
(3) (i%k) next available server => loop server id from status map ? =>!!! two heaps
availabler servers: once expected available time <= cur_t
time : keep increasing
pq (available time, server_idx, cnt)
server_status = {idx: T/F} Ture: available False: busy
return list of busiest server id
"""
class Solution:
def busiestServers(self, k: int, A: List[int], B: List[int]) -> List[int]:
"""
main idea: 3 heaps
1 heap : sort the busy server with its available time (available time, server_idx )
2 heaps server idx before and after current desired server id (i%k)
"""
request_per_server = [0] * k
busy_servers = []
before, after = [],list(range(k))
for i,(t,ld) in enumerate(zip(A,B)):
server_id = i%k
if server_id == 0: # loopback
before = after
after = []
while busy_servers and busy_servers[0][0] <= t :
available_server_id = heappop(busy_servers)[1]
if available_server_id < server_id :
heappush(before,available_server_id)
else:
heappush(after,available_server_id) # after queue contains id >= server_id
available_servers = after if after else before # prioritize after than before
if not available_servers : continue # drop current job
cur_server_id = heappop(available_servers)
request_per_server[cur_server_id] += 1
heappush(busy_servers,(t+ld,cur_server_id))
maxreq = max(request_per_server)
return [i for i,reqs in enumerate(request_per_server) if reqs == maxreq]