【贪心】活动安排 python

概述

贪心算法是一种简单而高效的算法思想,用于在每一步选择中都采取当前最优的选择,从而希望能够得到全局的最优解。在活动安排问题中,我们需要选择一组互不冲突的活动,使得能够安排尽可能多的活动。

流程图

flowchart TD
    start((开始))
    input{输入活动列表}
    check{检查活动列表是否为空}
    sort{按活动结束时间排序}
    result((输出最优活动安排))
    start-->input
    input-->check
    check-- 是 -->sort
    check-- 否 -->result
    sort-->result

类图

classDiagram
    class Activity {
        int start_time
        int end_time
        Activity(int start, int end)
    }

代码实现

步骤1:输入活动列表

首先,我们需要输入一个活动列表,列表中每个元素代表一个活动,其中包含活动的开始时间和结束时间。可以使用以下代码实现:

def input_activities():
    activities = []
    n = int(input("请输入活动的数量:"))
    for i in range(n):
        start_time = int(input("请输入第{}个活动的开始时间:".format(i+1)))
        end_time = int(input("请输入第{}个活动的结束时间:".format(i+1)))
        activity = Activity(start_time, end_time)
        activities.append(activity)
    return activities

步骤2:检查活动列表是否为空

接下来,我们需要检查活动列表是否为空,如果为空则直接输出结果。可以使用以下代码实现:

def check_activities(activities):
    if not activities:
        print("活动列表为空!")
        return False
    return True

步骤3:按活动结束时间排序

然后,我们需要按照活动的结束时间对活动列表进行排序。可以使用以下代码实现:

def sort_activities(activities):
    activities.sort(key=lambda x: x.end_time)

步骤4:输出最优活动安排

最后,我们需要根据贪心算法选择一组互不冲突的活动,并输出结果。可以使用以下代码实现:

def greedy_activity_selection(activities):
    selected_activities = []
    selected_activities.append(activities[0])
    last_activity = activities[0]
    for activity in activities[1:]:
        if activity.start_time >= last_activity.end_time:
            selected_activities.append(activity)
            last_activity = activity
    return selected_activities

完整代码

class Activity:
    def __init__(self, start_time, end_time):
        self.start_time = start_time
        self.end_time = end_time


def input_activities():
    activities = []
    n = int(input("请输入活动的数量:"))
    for i in range(n):
        start_time = int(input("请输入第{}个活动的开始时间:".format(i+1)))
        end_time = int(input("请输入第{}个活动的结束时间:".format(i+1)))
        activity = Activity(start_time, end_time)
        activities.append(activity)
    return activities


def check_activities(activities):
    if not activities:
        print("活动列表为空!")
        return False
    return True


def sort_activities(activities):
    activities.sort(key=lambda x: x.end_time)


def greedy_activity_selection(activities):
    selected_activities = []
    selected_activities.append(activities[0])
    last_activity = activities[0]
    for activity in activities[1:]:
        if activity.start_time >= last_activity.end_time:
            selected_activities.append(activity)
            last_activity = activity
    return selected_activities


if __name__ == "__main__":
    activities = input_activities()
    if check_activities(activities):
        sort_activities(activities)
        selected_activities = greedy_activity_selection(activities)
        print("最优活动安排为:")
        for activity in selected_activities:
            print("开始时间:{},结束时间:{}".format(activity.start_time, activity.end_time))

示例

假设我们输入以下活动列表:

活动1:开始时间 1,结束时间 4 活动2:开始时间 3,结束时间 5 活动3:开始时间 0,结束时间 6 活动4:开始时间 5,结束时间 7 活动5:开始时间 3,结束时间 8 活动6:开始时间 5,结束时间 9 活动7:开始时间 6,结束时间 10 活动