今天我们继续来使用贪心算法解决一道经典问题——活动安排问题。
学校的阶梯教室经常开展各类活动,活动开始和结束的时间都不一样,有可能会出现重叠,我们需要怎样安排才能尽可能多的开展活动呢。
问题描述:
活动信息表如上所示,我们如何安排才能尽可能多的开展活动呢?
为了解决上述问题,我们可以考虑本章介绍的贪心算法。
目标是在固定的教室中尽量多地安排活动, 可以考虑的贪心策略有总是选择最早开始的、总是选择时间最短的、总是选择与其他活动冲突最少的、总是选择结束时间最早的。
在这里,我们用总是选择结束时间最早的活动这一选择方案作为解题的贪心策略,后面的证明部分会验证该策略符合贪心选择性质和最优子结构性质。
def bubble_sort(s,f):
for i in range(len(f)):
for j in range(0,len(f)-i-1):
if f[j] > f[j+1]:
f[j],f[j+1] = f[j+1],f[j]
s[j],s[j+1] = s[j+1],s[j]
return s,f
def greedy_activity(s,f,n):
a = [True for x in range((n))]
j = 0
for i in range(1,n):
if s[i] >= f[j]:
a[i] = True
j = i
else:
a[i] = False
return a
n = int(input("输入活动数量和起始时间(数量和活动用回车分割,活动之间用空格分隔)"))
arr = input().split()
s = []
f = []
for ar in arr:
ar = ar[1:-1]
start = int(ar.split(',')[0])
end = int(ar.split(',')[1])
s.append(start)
f.append(end)
s,f = bubble_sort(s,f)
G = greedy_activity(s,f,n)
res = []
for t in range(len(G)):
if G[t]:
res.append('({},{})'.format(s[t],f[t]))
print(' '.join(res))