蓝桥杯真题——谈判

题目描述
在很久很久以前,有 n 个部落居住在平原上,依次编号为 1到 n。第 i个部落的人数为 t1
有一年发生了灾荒。年轻的政治家小蓝想要说服所有部落一同应对灾荒,他能通过谈判来说服部落进行联合。
每次谈判,小蓝只能邀请两个部落参加,花费的金币数量为两个部落的人数之和,谈判的效果是两个部落联合成一个部落
(人数为原来两个部落的人数之和)。
输入描述
输入的第一行包含一个整数 n,表示部落的数量。
第二行包含 n 个正整数,依次表示每个部落的人数。
输出描述
输出一个整数,表示最小花费。
输入输出样例
示例 1
输入

4
9 1 3 5
输出

31
运行限制
最大运行时间:1s
最大运行内存: 128M
# accumulate(iterable [,func])是一个计算迭代器,如果不指定参数函数,
# 将会采取默认的求和函数,也可以指定参数函数,比如求最大值
"""
 思想:贪心
 贪心算法的基本思路是从问题的某一个初始解出发一步一步地进行,根据某个优化测度,每一步都要确保能获得局部最优解。
 每一步只考虑一个数据,他的选取应该满足局部优化的条件。若下一个数据和部分最优解连在一起不再是可行解时,
 就不把该数据添加到部分解中,直到把所有数据枚举完,或者不能再添加算法停止 
 贪婪算法可解决的问题通常大部分都有如下的特性:
 随着算法的进行,将积累起其它两个集合:一个包含已经被考虑过并被选出的候选对象,另一个包含已经被考虑过但被丢弃的候选对象。
 有一个函数来检查一个候选对象的集合是否提供了问题的解答。该函数不考虑此时的解决方法是否最优。
 还有一个函数检查是否一个候选对象的集合是可行的,也即是否可能往该集合上添加更多的候选对象以获得一个解。
 和上一个函数一样,此时不考虑解决方法的最优性。
 选择函数可以指出哪一个剩余的候选对象最有希望构成问题的解。
 最后,目标函数给出解的值。
 为了解决问题,需要寻找一个构成解的候选对象集合,它可以优化目标函数,贪婪算法一步一步的进行。起初,
 算法选出的候选对象的集合为空。接下来的每一步中,根据选择函数,算法从剩余候选对象中选出最有希望构成解的对象。
 如果集合中加上该对象后不可行,那么该对象就被丢弃并不再考虑;否则就加到集合里。每一次都扩充集合,
 并检查该集合是否构成解。如果贪婪算法正确工作,那么找到的第一个解通常是最优的

"""
# 一维列表为主要解决问题,1~n表示为一维列表
# 方法一
# 一维列表为主要解决问题,1~n表示为一维列表
from itertools import accumulate

m = int(input())  # 输入数据
lis = [int(x) for x in input().split()]  # 创建一个lis花费的金币数量为两个部落的人数之和
lis.sort()  # 列表排序
sum1 = list(accumulate(lis))
print(sum(sum1) - lis[0])


# 方法二

n = int(input())
t = list(map(int,input().split()))
t.sort()
tot = (n - 1) * t[0]
for i in range(1, n):
  tot += t[i] * (n - i)
print(tot)

你可能感兴趣的:(蓝桥杯,职场和发展,贪心算法)