Python 求解闭区间选点最小总成本问题:代码、解释与复杂度分析
以下是解决该问题的Python代码: ```python # 读取输入 n = int(input()) # 存储区间的列表 intervals = [] for _ in range(n): l, r = map(int, input().split()) intervals.append((l, r)) # 按照区间的右边界从小到大排序 intervals.sort(key=lambda x: x[1]) # 存储选择的点 selected_points = [] # 遍历每个区间 for l, r in intervals: # 检查是否已经有选择的点在当前区间内 found = False for point in selected_points: if l <= point <= r: found = True break # 如果没有找到点在当前区间内,则选择该区间的右边界作为新的点 if not found: selected_points.append(r) # 计算选择的点的总成本 total_cost = sum(selected_points) print(total_cost) ``` 代码解释: 1. 输入读取:首先读取区间的数量 `n`,然后循环 `n` 次,每次读取一个区间的左右边界,并将其存储在 `intervals` 列表中。 2. 区间排序:使用 `sort` 方法按照区间的右边界从小到大对 `intervals` 列表进行排序。这样做的目的是优先选择右边界较小的区间,因为选择右边界的点可以覆盖尽可能多的后续区间。 3. 选择点:遍历排序后的区间列表,对于每个区间,检查是否已经有选择的点在该区间内。如果没有,则选择该区间的右边界作为新的点,并将其添加到 `selected_points` 列表中。 4. 计算总成本:使用 `sum` 函数计算 `selected_points` 列表中所有点的总和,并将其作为最小总成本输出。 复杂度分析: - 时间复杂度:排序操作的时间复杂度为 $O(n log n)$,遍历区间列表的时间复杂度为 $O(n^2)$,因此总的时间复杂度为 $O(n^2)$。 - 空间复杂度:主要使用了 `intervals` 和 `selected_points` 两个列表,空间复杂度为 $O(n)$。 ######[AI问答 | 500点数解答 | 2025-12-13 10:58:42]
- Python实现45位学生四次成绩随机录入及输出(GPT | 441点数解答 | 2024-12-21 21:02:22)249
- Python实现:随机录入45位学生四次成绩函数大揭秘(GPT | 477点数解答 | 2024-12-17 17:00:35)351
- Python实现班级45位同学成绩生成、总评计算及分数统计(字节豆包 | 579点数解答 | 2024-12-21 11:55:01)241
- Python实战:45位同学成绩生成、总评计算与分数统计揭秘(字节豆包 | 688点数解答 | 2024-12-22 10:14:17)241
- Python 运行报错:urllib3 网络连接创建失败,原因及排查建议(字节豆包 | 161点数解答 | 2024-10-31 00:39:36)458
- C++求解序列或与运算和差值:避O(nq)复杂度及数据处理要点(字节豆包 | 534点数解答 | 2025-10-17 20:05:07)60
- Python 实战:学生信息列表转字典、遍历、深拷贝及数据修改全流程(GPT | 422点数解答 | 2024-10-29 15:43:54)414
- Python实战:学生成绩列表转字典,深拷贝与数据修改操作全解析(字节豆包 | 254点数解答 | 2024-10-29 16:01:39)405
- 探寻数组中最长摆动子序列长度:思路剖析与代码优化(GPT | 758点数解答 | 2024-12-23 23:18:29)264
- 独家剖析:求解数组最长摆动子序列长度的代码实现与改进建议(GPT | 350点数解答 | 2024-12-23 23:20:54)261
- 求解 1 至 n 内第 k 大孤独数:质数与余数的巧妙探寻(字节豆包 | 298点数解答 | 2025-11-10 20:01:57)153
- 巧判小朋友同桌意愿:满足需求还是无解难题?(字节豆包 | 599点数解答 | 2025-11-16 20:06:12)67