LC 1882. 使用服务器处理任务
https://leetcode-cn.com/problems/process-tasks-using-servers/
好几次遇到这类问题了,我觉得基本上可以抽取出某种模式了:
- server available可以作为单独事件来看待,同样task available也可以
- 所有事件都放在优先队列里面,按照时间进行排序
- 从优先队列里面取出第一个元素,这个元素的时间就是 current_timestamp.
- 然后从优先队列里面取出所有的相同时间的事件,这些事件都可以进行处理
- 处理这些事件(匹配或者是什么),然后会产生新的事件(server available next time)
class Solution: def assignTasks(self, servers: List[int], tasks: List[int]) -> List[int]: import heapq ev = [] for i in range(len(servers)): ev.append((0, 0, i)) for i in range(len(tasks)): ev.append((i, 1, i)) heapq.heapify(ev) from collections import deque srv = [] Q = deque() ans = [-1] * len(tasks) todo = len(tasks) while ev and todo: # print('ev', ev) ct = ev[0][0] while ev and ev[0][0] == ct: (t, type, idx) = heapq.heappop(ev) if type == 0: # server avail heapq.heappush(srv, (servers[idx], idx)) elif type == 1: # task avail Q.append(idx) # print(srv, Q) while Q and srv: _, srvidx = heapq.heappop(srv) tidx = Q.popleft() ans[tidx] = srvidx print('assign ', tidx, srvidx) todo -= 1 heapq.heappush(ev, (ct + tasks[tidx], 0, srvidx)) return ans