【算法】贪心

活动安排

问题描述:给很多电影的开始和结束时间,看每个电影之间需要间隔3分钟,返回看尽可能多的电影的个数。编写函数max_num_movies(movie_list),movie_list 是(start_time, end_time) 元组。

样例

movie_times = [
    (299, 330),
    (250, 350),
    (280, 297),
    (340, 360),
    (360, 380),
    (300, 337)
]
print(max_num_movies(movie_times))

输出:3

贪心规则:优先安排最早结束的电影

样例解释:按照安排最早结束的电影排序,选中(280, 297),开始点变为297+3=300,再选中(300, 337),开始点变为337+3=340,再选中(340, 360),开始点变为360+3=363结束。

(280, 297),
(299, 330),
(300, 337),
(250, 350),
(340, 360),
(360, 380),  

参考代码:

def max_num_movies(movie_list):
    #优先安排最早结束的活动
    if movie_list == []:
        return 0
    result = []
    ans = []
    for start, end in movie_list:
        item = end, start
        result.append(item)
    sorted_list = sorted(result)

    ans.append(sorted_list[0])
    j = 0
    for i in range(1, len(sorted_list)):
        if sorted_list[i][1] >= sorted_list[j][0]+3:
            ans.append(sorted_list[i])
            j = i
    return len(ans)

movie_times = [
    (299, 330),
    (250, 350),
    (280, 297),
    (340, 360),
    (360, 380),
    (300, 337)
]
print(max_num_movies(movie_times))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值