P1090 [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
n=int(input())
arr=list(map(int,input().split()))
arr.sort()
sum=arr[0]
total_sum=0
#一开始以为单纯排列就行了,然后将之前累计的时间求和
for i in range(1,n):sum+=arr[i]total_sum+=sum
print(total_sum)
单纯排序是不行的,因为每次要选出序列中最小的两个数合并,一开始有序不代表合并后也有序
这边建议优先队列。
n=int(input())
arr=list(map(int,input().split()))
sum=0
total_sum=0
while len(arr)>1: #当列表中仅剩下一堆果子时结束循环arr.sort() #每次合并果子时,升序排序sum=arr[0]+arr[1] #这样就能得到每次合并最少时间total_sum+=sum #累计时间求和arr=arr[2:] #合并之后把首位的两个数去掉arr.append(sum) #再把合并得到的新果子数放入列表中
print(total_sum)