【青训营笔记创作活动】106 小M的多任务下载器挑战

28 阅读2分钟

问题描述

小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

解决思路

这道题可以拆解为以下几个步骤:

  1. 解析输入数据

    • n 是用户的数量,m 是实验的数量,q 是查询的次数。
    • arrayN 是每个用户命中的实验列表。
    • arrayQ 是查询条件列表,查询条件可以是正数(命中实验)或负数(未命中实验)。
  2. 数据表示和查询条件匹配

    • 用一个字典表示每个用户命中的实验,用集合存储实验编号便于快速查找。
    • 遍历每个查询条件,统计满足该条件的用户数量。
  3. 匹配逻辑

    • 对于每个查询条件(例如 [2, 1, -2]),分别检查每个用户是否符合:

      • 如果条件是正数,例如 1,则用户必须命中实验 1
      • 如果条件是负数,例如 -2,则用户不能命中实验 2
    • 若所有条件均满足,则统计该用户。

  4. 输出结果

    • 每个查询条件的匹配结果存储为一个数组,最终返回结果。
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