修桌子

Arthur最近搬到了新的别墅,别墅特别大,原先的桌子显得比较小,所以他决定换一张新的桌子。他买了一张特
别大的桌子,桌子是由很多条桌腿进行支撑的,可是回到家之后他发现桌子不稳,原来是桌子腿长度不太相同。他
想要自己把桌子修理好,所以他决定移除掉一些桌腿来让桌子变得平稳。桌子腿总共有n条腿,第i条腿长度为li,
Arthur移除第i桌腿要花费代价为di。假设k条腿桌子平稳的条件:超过一半桌腿能够达到桌腿长度的最大值。
例如:一条腿的桌子是平稳的,两条腿的桌子腿一样长时是平稳的。请你帮Arthur计算一下是桌子变平稳的
最小总代价。 

输入:

第一行数据是一个整数:n (1≤n≤105),n表示桌腿总数。
第二行数据是n个整数:l1, l2, ..., ln (1≤li≤105),表示每条桌腿的长度。
第三行数据是n个整数:d1, d2, ..., dn (1≤di≤200),表示移除每条桌腿的代价。

输出:

输出让桌子变平稳的最小总代价

首先按照能量从小到大进行排序,执行以下几步:
1)总数为n,最长腿数为m
2)如果最长腿数过半,则退出;
3)不超过一半,若保留最长腿,则从排序的能量中选出(n-m-(m-1))个非最长腿对应的能量,求和;
4)若不保留最长腿,则去掉最长腿对应的l和d,执行1)、2)、3)。
代码如下:

n = int(input())
l = list(map(int, input().split(' ')))
d = list(map(int, input().split(' ')))
def min_energy(l, d, n):
    max_ = max(l)
    m = 0
    d1 = []
    l1 = []
    d_max = []
    for i in range(n):
        if l[i] == max_:
            m += 1
            d_max.append(d[i])
        else:
            d1.append(d[i])
            l1.append(l[i])
    if m > n/2:
        return 0
    return min(sum(d1[:n-2*m+1]), sum(d_max)+min_energy(l1, d1, len(l1)))
def sort_by_d(val):
    return val[1]
d_l = list(zip(l, d))
d_l.sort(key=sort_by_d)
d_ = [v[1] for v in d_l]
l_ = [v[0] for v in d_l]
print(min_energy(l_, d_, n))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值