蓝桥杯 谈判 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)    #此时所有部落已经联合成一个部落,输出最小的花费

蓝桥杯 谈判 python组_第1张图片

你可能感兴趣的:(蓝桥杯题库,python,蓝桥杯,贪心算法)