Problem Description
给你两个下标从
0
开始的整数数组servers
和tasks
,长度分别为n
和m
。servers[i]
是第i
台服务器的权重 ,而tasks[j]
是处理第j
项任务所需要的时间(单位:秒)。你正在运行一个仿真系统,在处理完所有任务后,该系统将会关闭。每台服务器只能同时处理一项任务。第
0
项任务在第0
秒可以开始处理,相应地,第j
项任务在第j
秒可以开始处理。处理第j
项任务时,你需要为它分配一台权重最小的空闲服务器。如果存在多台相同权重的空闲服务器,请选择下标最小的服务器。如果一台空闲服务器在第t
秒分配到第j
项任务,那么在t + tasks[j]
时它将恢复空闲状态。如果没有空闲服务器,则必须等待,直到出现一台空闲服务器,并尽可能早地处理剩余任务。 如果有多项任务等待分配,则按照下标递增的顺序完成分配。
如果同一时刻存在多台空闲服务器,可以同时将多项任务分别分配给它们。
构建长度为
m
的答案数组ans
,其中ans[j]
是第j
项任务分配的服务器的下标。返回答案数组
ans
。
note
servers.length == n
tasks.length == m
1 <= n, m <= 2 * 105
1 <= servers[i], tasks[j] <= 2 * 105
e.g.
示例 1:
1
2
3
4
5
6
7
8
9
10输入:servers = [3,3,2], tasks = [1,2,3,2,1,2]
输出:[2,2,0,2,1,2]
解释:事件按时间顺序如下:
0 秒时,第 0 项任务加入到任务队列,使用第 2 台服务器处理到 1 秒。
1 秒时,第 2 台服务器空闲,第 1 项任务加入到任务队列,使用第 2 台服务器处理到 3 秒。
2 秒时,第 2 项任务加入到任务队列,使用第 0 台服务器处理到 5 秒。
3 秒时,第 2 台服务器空闲,第 3 项任务加入到任务队列,使用第 2 台服务器处理到 5 秒。
4 秒时,第 4 项任务加入到任务队列,使用第 1 台服务器处理到 5 秒。
5 秒时,所有服务器都空闲,第 5 项任务加入到任务队列,使用第 2 台服务器处理到 7 秒。
示例 2:
1
2
3
4
5
6
7
8
9
10
11输入:servers = [5,1,4,3,2], tasks = [2,1,2,4,5,2,1]
输出:[1,4,1,4,1,3,2]
解释:事件按时间顺序如下:
0 秒时,第 0 项任务加入到任务队列,使用第 1 台服务器处理到 2 秒。
1 秒时,第 1 项任务加入到任务队列,使用第 4 台服务器处理到 2 秒。
2 秒时,第 1 台和第 4 台服务器空闲,第 2 项任务加入到任务队列,使用第 1 台服务器处理到 4 秒。
3 秒时,第 3 项任务加入到任务队列,使用第 4 台服务器处理到 7 秒。
4 秒时,第 1 台服务器空闲,第 4 项任务加入到任务队列,使用第 1 台服务器处理到 9 秒。
5 秒时,第 5 项任务加入到任务队列,使用第 3 台服务器处理到 7 秒。
6 秒时,第 6 项任务加入到任务队列,使用第 2 台服务器处理到 7 秒。
Solution
第 243 场周赛的第三题,虽然这场没参加(周赛基本都起不来),不过后来做了下还挺有趣,TLE
了一发,感觉很适合拿来面试的考察求职者的代码设计以及优化能力。主要考察堆排序、队列、多任务处理这些点。
甚至我都快想要开多个线程来做了。
这题可以直接模拟,模拟法需要注意的三个地方吧,不然会超时:
- 注意存在某个时刻会出现多个任务可被执行
- 防止 TLE :直接跳转到运行队列中的最先空闲下来的服务器时间节点
- 防止 TLE :两个优先队列处理(运行态和就绪态)
1 | class Solution { |