问题描述
小M的程序设计大作业是编写一个多任务下载器。在实现过程中,他遇到了一个问题:在一次下载过程中,总共有N个任务,每个任务会在第x秒开始,并持续y秒。小M需要知道,在同一时刻,最多有多少个任务正在同时下载,也就是计算出任务的最高并发数。
-
n表示任务的数量。 -
array是一个二维列表,每个元素为[x, y],表示任务的开始时间和持续时间,其中: -
x表示任务的开始时间; -
y表示任务的持续时间。 小M的程序设计大作业是编写一个多任务下载器。在实现过程中,他遇到了一个问题:在一次下载过程中,总共有N个任务,每个任务会在第x秒开始,并持续y秒。小M需要知道,在同一时刻,最多有多少个任务正在同时下载,也就是计算出任务的最高并发数。 -
n表示任务的数量。 -
array是一个二维列表,每个元素为[x, y],表示任务的开始时间和持续时间,其中: -
x表示任务的开始时间; -
y表示任务的持续时间。
测试样例
样例1:
输入:
n = 2 ,array = [[1, 2], [2, 3]]
输出:2
样例2:
输入:
n = 4 ,array = [[1, 2], [2, 3], [3, 5], [4, 3]]
输出:3
样例3:
输入:
n = 5 ,array = [[1, 3], [3, 4], [2, 2], [6, 5], [5, 3]]
输出:3
解决思路
这道题可以拆解为以下几个步骤:
-
解析输入数据:
n是用户的数量,m是实验的数量,q是查询的次数。arrayN是每个用户命中的实验列表。arrayQ是查询条件列表,查询条件可以是正数(命中实验)或负数(未命中实验)。
-
数据表示和查询条件匹配:
- 用一个字典表示每个用户命中的实验,用集合存储实验编号便于快速查找。
- 遍历每个查询条件,统计满足该条件的用户数量。
-
匹配逻辑:
-
对于每个查询条件(例如
[2, 1, -2]),分别检查每个用户是否符合:- 如果条件是正数,例如
1,则用户必须命中实验1。 - 如果条件是负数,例如
-2,则用户不能命中实验2。
- 如果条件是正数,例如
-
若所有条件均满足,则统计该用户。
-
-
输出结果:
- 每个查询条件的匹配结果存储为一个数组,最终返回结果。
def solution(n, array):
events = []
# 将任务的开始和结束时间作为事件记录
for task in array:
start, duration = task
events.append((start, 1)) # 开始事件
events.append((start + duration, -1)) # 结束事件
# 按时间排序,结束事件优先
events.sort(key=lambda x: (x[0], x[1]))
max_concurrent = 0
current_concurrent = 0
# 遍历事件计算并发数
for time, change in events:
current_concurrent += change
max_concurrent = max(max_concurrent, current_concurrent)
return max_concurrent