题目描述在很久很久以前,有 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) #此时所有部落已经联合成一个部落,输出最小的花费