《你也能看得懂的Python算法书》学习笔记(十)

今天我们继续来使用贪心算法解决一道经典问题——活动安排问题。

学校的阶梯教室经常开展各类活动,活动开始和结束的时间都不一样,有可能会出现重叠,我们需要怎样安排才能尽可能多的开展活动呢。

问题描述:

活动信息表如上所示,我们如何安排才能尽可能多的开展活动呢?

为了解决上述问题,我们可以考虑本章介绍的贪心算法。

目标是在固定的教室中尽量多地安排活动, 可以考虑的贪心策略有总是选择最早开始的、总是选择时间最短的、总是选择与其他活动冲突最少的、总是选择结束时间最早的。

在这里,我们用总是选择结束时间最早的活动这一选择方案作为解题的贪心策略,后面的证明部分会验证该策略符合贪心选择性质和最优子结构性质。

    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))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值