- 问题
有n项活动申请使用同一个礼堂,每项活动有一个开始时间和一个截止时间。如果任何两个活动不能同时举行,问如何选择这些活动,从而使得被安排的活动数量达到最多。设S={1,2,…,n}为活动的集合,si和fi分别为活动i的开始和截止时间,i=1,2,…,n。定义:活动i和j相容<==>si≥fj或sj≥fi,i≠j求S最大的两两相容的活动子集A。 - 解析
方法一:按活动截止时间从小到大排序。
(1) 选择活动1,截止时间最早:活动2,3与活动1不相容,活动4与活动1相容;
(2) 选择活动4:活动5,6,7与活动4不相容,活动8与活动4相容;
(3) 选择活动8:活动9,10与活动8不相容。
k=3。
方法二:按照开始时间给活动排序。
方法三:按照活动的占用时间排序。
- 设计
A={1}
j=1
for i=2 to n do
if si≥fj
then j=i
return A - 分析
O(n) - 源码
https://github.com/CunHua-YYT/CunHua-YYT/blob/master/Compatible.cpp