1 条题解
-
0
这是一个环形区间覆盖问题。我们可以通过以下步骤解决:
- 问题转化 由于时间是环形的,我们将问题转化为线性问题:
对于跨天区间 (即 ),将其转化为
这样所有区间都在 的范围内
- 贪心算法 使用经典的区间覆盖贪心策略:
按开始时间排序所有区间
从时间点 开始,每次选择能覆盖当前位置且结束时间最远的区间
重复直到覆盖整个环形时间轴
算法步骤 步骤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
复杂度分析 时间复杂度:,主要来自排序
空间复杂度:,存储区间信息
边界情况处理 无法覆盖:如果在贪心过程中无法找到能扩展覆盖的区间,返回
单个助手:如果一个助手的工作区间长度小于 ,无法单独覆盖全天
跨天工作:正确处理 的情况
- 1
信息
- ID
- 3559
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 4
- 已通过
- 1
- 上传者