【贪心】活动安排 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 活动