📜  活动选择问题(1)

📅  最后修改于: 2023-12-03 15:11:05.283000             🧑  作者: Mango

活动选择问题

活动选择问题是一个经典的贪心算法问题。假设有n个活动需要在同一天安排,每个活动i有一个开始时间si和结束时间fi,只有在活动i的开始时间si和结束时间fi之间参加这个活动才算作完成活动i。每个活动只能参加一次,求最多能参加多少个活动。

算法思路

这个问题可以通过贪心算法解决。我们先将所有的活动按照结束时间fi从小到大排序,然后按照顺序依次选择活动。每次选择的活动要满足它的开始时间si大于等于上一个活动的结束时间fi。如果在所有满足条件的活动中选择结束时间最早的,那么我们就可以使参加的活动数量最多。

代码实现
def activity_selection(start, end):
    n = len(end)
    selected = [True] * n
    last_selected = 0
    for i in range(1, n):
        if start[i] >= end[last_selected]:
            last_selected = i
        else:
            selected[i] = False
    return [i for i in range(n) if selected[i]]
测试代码
start = [1, 3, 0, 5, 8, 5]
end = [2, 4, 6, 7, 9, 9]
selected = activity_selection(start, end)
print("Selected activities:", selected)
运行结果
Selected activities: [0, 1, 3, 4]

以上代码可以选择活动0、1、3和4,结束时间分别为2、4、7和9。

时间复杂度

由于需要对n个活动进行排序,时间复杂度为O(nlogn),而依次选择活动的过程只需要进行一次线性扫描,因此时间复杂度为O(n),算法的总时间复杂度为O(nlogn)。

应用场景

活动选择问题可以应用于时间调度等场景。例如,在某个教室有多个讲座需要安排,每个讲座的时间都不同,而在同一时间只能有一个讲座,使用活动选择问题就能够快速得到最优的讲座安排方案。