小Q和牛博士在玩一个石子合并的游戏,初始一共有n堆石子,每堆石子有w[i]个石子。小Q和牛博士他们需要对石子堆进行合并,每次他们可以任意选择两堆石子进行合并。一堆有x个石子的石子堆和一堆有y个石子的石子堆合并将得到一堆x+y个石子的石子堆,这次合并得分为x*y,当只剩下一堆石子的时候游戏结束。
、小Q和牛博士希望采取优秀的策略获得最大得分,希望你能来帮他们算算最大得分多少。
小Q和牛博士在玩一个石子合并的游戏,初始一共有n堆石子,每堆石子有w[i]个石子。小Q和牛博士他们需要对石子堆进行合并,每次他们可以任意选择两堆石子进行合并。一堆有x个石子的石子堆和一堆有y个石子的石子堆合并将得到一堆x+y个石子的石子堆,这次合并得分为x*y,当只剩下一堆石子的时候游戏结束。
、小Q和牛博士希望采取优秀的策略获得最大得分,希望你能来帮他们算算最大得分多少。
输入包括两行,第一行一个正整数n(2≤n≤100)。
第二行包括n个正整数w[i](1≤w[i]≤100),即每堆石子的个数。
输出一个正整数,即小Q和牛博士最大得分是多少。
3 1 2 3
11
while True: try: n=int(input().strip()) inp=list(map(int,input().strip().split(' '))) #print(inp) inp=sorted(inp) list1=[] while len(inp)!=1: sum1=inp[-1]+inp[-2] mul=inp[-1]*inp[-2] list1.append(mul) inp=inp[:-2]+[sum1] #print(list1) result=sum(list1) print(result) except: break
# 获取输入的数据 n = int(input()) w = list(map(int, input().split())) # 初始化得分为0 score = 0 def cross(w, score): """ 定义一个函数,每次调用都会合并w中最接近的两项 :param w: :param score: :return: """ # if n == 1: # return w, score # 对w的预处理,排序;使得最相近的两数相邻 w = sorted(w) # 求w的极差 gap = max(w)-min(w) # 寻找最相邻的两数也是一个遍历过程,可能的取值从0到极差 for i in range(gap+1): # 从头遍历w中的 每个元素,看它与它的前一项是否符合本轮要找的最相近的两数 for j in range(1, len(w)): if w[j]-w[j-1] == i: # 当找到最相邻的两数时,更新得分 score += w[j]*w[j-1] # w得到两数合并之后的新的成员 w.append(w[j] + w[j - 1]) # 除去旧的成员 w.pop(j) w.pop(j-1) # 只要找到就可以直接推出循环,返回新的w与更新过的score return w, score while True: # 多次调用函数,直到w长度为1时,推出循环 if len(w) == 1: break else: w, score = cross(w, score) print(score)
n=int(input()) L=list(map(int,input().split())) L.sort() s=0 for i in range(n-1): t=L.pop() s+=(t*L[-1]) L[-1]+=t print(s)