问题
给出若干个节目在同一个舞台演出,每个节目需要占用一段时间的舞台,用起始时间和结束时间表示。
不同的节目占用舞台的时间不可以有重叠,如何安排可以被安排上的节目数量最多。
解析
对所有节目按照结束时间升序排列,按顺序排列不冲突的节目,最终得到的就是不冲突节目数量最多的安排
证明:
- 定理1:设时间区间
的最优解为
,
,其中
一定是区间
的最优解
- 证明:
- 若
不是区间
的最优解,则存在
,显然
,这与
是最优解相悖,所以
一定是区间
的最优解
- 定理2:设
是区间
中最早结束的事件,则
在区间
的其中一个最优解
中
- 证明:
- 设区间
的一个最优解为
,若事件
是
中最先发生的一个事件,事件
为区间
内最早结束的事件,结束时间为
记作
,则
- 若
,则与结论相符合
- 若
,则
的结束事件必然
,用
替换
不影响解的相容性,所以
也是区间
的一个最优解
- 若
- 证明:贪心的选择最早结束的事件能够组成最优解;数学归纳法证明如下
- 由定理2可知,最早结束的第一个事件
一定属于最优解之一
- 假设已知前
个事件的最优解为
,则
:由定理1可知
,再由定理2,结束时间最早的事件
必然是
的一部分,所以
- 由定理2可知,最早结束的第一个事件
得证
其他贪心策略
- 按起始时间升序,反例:{{1,100},{2,2},{3,3},{4,4}}
- 按占用时间升序,反例:{{3,4},{1,3},{4,10}}
设计
- a.sort(key=finishTime)
- pre=-1,S=
- for e in a:
if e.startTime>pre:
pre=e.finishTime,S.append(e)
- return S
分析
排序的复杂度为
枚举的复杂度为
总复杂度为