贪心算法-过河问题

描述: N位旅行者在夜里过桥需要借助手电筒。但N个人中只有一个手电筒,而且桥同时只能让两个人过。每个人单独过桥所需时间已知,但如果两个人同时过桥则所需时间是走得慢的那个人单独过桥所需的时间。设计一个方案,让这N个人尽快过桥,计算这N个人的最短过桥时间。

比如:有甲乙两丁四个人,他们过河所需的时间分别是1, 2, 5, 10。让最快的2个人先过桥,然后让跑的最快的人回去接剩下的人。先让甲乙过去(2分钟),甲回来(1分钟) ,甲丙过去(5分钟),甲回来(1分钟),甲丁再过去(10分钟),总共需要19分钟。

输入:第一行N(表示有N个人要过河),第二行是N个整数S,表示这N个人过河所需时间
输出:所有人过河的最短时间
样例输入: 4
12510
样例输出: 17

def f(n, s):
    s.sort()
    res = 0
    for i in range(1, n):
        if i == n - 1:
            temp = max(s[0], s[i])
            res = res + temp
        else:
            temp = max(s[0], s[i]) + s[0]
            res = res + temp
    return res
def f1(n, s):
    s.sort()
    res = s[0]
    Next = [s[0], s[1]]
    Cur = s
    Cur.remove(Cur[0])
    Cur.remove(Cur[0])
    while (1):
        if len(Next) == n:
            break
        else:
            temp1 = max(Cur[len(Cur) - 1], Cur[len(Cur) - 2])
            Cur.remove(temp1)
            Next.append(temp1)
            if len(Next) == n:
                res = res + temp1
                break
            elif len(Cur)==1:
                temp2 = min(Next)
                res = res + temp1 + temp2
            else:
                temp2 = min(Next)
                Next.remove(temp2)
                Cur.append(temp2)
                res = res + temp1 + temp2

    return res


print(f1(4, [2, 5, 10, 1]))

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值