1 条题解

  • 0
    @ 2025-10-19 23:25:49

    这是一个环形区间覆盖问题。我们可以通过以下步骤解决:

    1. 问题转化 由于时间是环形的,我们将问题转化为线性问题:

    对于跨天区间 [si,ei][s_i, e_i](即 si>eis_i > e_i),将其转化为 [si,ei+M][s_i, e_i + M]

    这样所有区间都在 [0,2M)[0, 2M) 的范围内

    1. 贪心算法 使用经典的区间覆盖贪心策略:

    按开始时间排序所有区间

    从时间点 00 开始,每次选择能覆盖当前位置且结束时间最远的区间

    重复直到覆盖整个环形时间轴

    算法步骤 步骤1:预处理区间 python intervals = [] for i in range(N): s, e = s_i, e_i if s > e: # 跨天工作 e += M intervals.append((s, e)) 步骤2:排序和贪心选择 python

    按开始时间排序

    intervals.sort()

    current_end = 0 # 当前已覆盖到的时间点 count = 0 # 已选择的助手数量 i = 0 # 当前考虑的区间索引

    while current_end < M: # 需要覆盖整个环形 max_end = current_end # 找出所有开始时间不超过current_end的区间中,结束时间最远的 while i < len(intervals) and intervals[i][0] <= current_end: max_end = max(max_end, intervals[i][1]) i += 1

    if max_end == current_end:  # 无法继续扩展覆盖
        return -1
    
    count += 1
    current_end = max_end
    

    复杂度分析 时间复杂度:O(NlogN)O(N \log N),主要来自排序

    空间复杂度:O(N)O(N),存储区间信息

    边界情况处理 无法覆盖:如果在贪心过程中无法找到能扩展覆盖的区间,返回 1-1

    单个助手:如果一个助手的工作区间长度小于 MM,无法单独覆盖全天

    跨天工作:正确处理 si>eis_i > e_i 的情况

    • 1

    信息

    ID
    3559
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    4
    已通过
    1
    上传者