蓝桥杯 谈判 python组

题目描述在很久很久以前,有 n 个部落居住在平原上,依次编号为 1 到 n。第 i 个部落的人数为 ti​。

有一年发生了灾荒。年轻的政治家小蓝想要说服所有部落一同应对灾荒,他能通过谈判来说服部落进行联合。

每次谈判,小蓝只能邀请两个部落参加,花费的金币数量为两个部落的人数之和,谈判的效果是两个部落联合成一个部落(人数为原来两个部落的人数之和)。

输入描述

输入的第一行包含一个整数 n,表示部落的数量。

第二行包含 n 个正整数,依次表示每个部落的人数。

其中,1≤n≤1000,1≤ti​≤10**4。

输出描述

输出一个整数,表示最小花费。

解答:

最小花费就说明每次选择人数最小的两个部落,则总花费就最少,符合贪心算法。每次选择最小的两个部落联合之后的部落,和没有选择的部落之中再选最小的两个部落,进行联合,因为两个部落联合之后还会再次联合,一直到所有部落都联合之后才结束。所以最小花费就是每次选择两个人数最少的部落进行联合,把联合之后的部落和其他部落再选出最小的部落进行联合

该题满足贪心算法,即局部最优等于全局最优,对应题目中每次联合花费最小即为总和最小

import os
import sys

# 请在此输入您的代码
# 谈判
n = int(input())    #共n个部落
ans = list(map(int, input().split()))    #存放n个部落的人数
ans.sort()    #进行排序,使得人数最小的两个部落,放在最前面
cost = 0
while len(ans) > 1:    #当所有部落已经联合成一个部落的时候,循环结束,退出
    cost += (ans[0]+ans[1])    #人数最小的两个部落进行联合
    ans.append(ans[0]+ans[1])    #把联合之后的新部落加入进去
    del ans[0]    #把已经被联合的这两个部落删除
    del ans[0]
    ans.sort()    #重新排序,使得人数最小的两个部落,放在最前面,即ans[0]和ans[1]的位置
print(cost)    #此时所有部落已经联合成一个部落,输出最小的花费

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

缱绻命运

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值