这天,AutSky_JadeK看到了n张图片,他忍不住说道:“我TM社保!”。
每张图片有一个社保值,他可以合并两张图片,合并所得的图片的社保值是原来两张图片的社保值之和。
每次合并需要消耗的体力也是原来两张图片的社保值之和。 显然,n−1次合并之后,只剩下一张图片。
他想知道,在这个过程中,他消耗的总体力最少是多少。
Input
第一行包含一个整数n,
第二行包含n个整数A1,A2,…,An,代表n张图片的社保值。
Output
输出一行,包含一个整数,代表他消耗的总体力最少是多少。
Sample input and output
Sample Input Sample Output
3
1 2 9
15
Hint
1≤n≤200001≤n≤20000,
1≤Ai≤20001≤Ai≤2000
解题思路 优先队列
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <cmath> #include <vector> #include <algorithm> using namespace std; typedef long long ll; int main() { priority_queue<ll,vector<ll>,greater<ll> >q; ll n,x,a,b; ll ans=0; cin>>n; for(int i=0;i<n;i++) { cin>>x; q.push(x); } while(q.size()>=2) { a=q.top(); q.pop(); b=q.top(); q.pop(); a=a+b; ans+=a; q.push(a); } cout<<ans<<endl; return 0; }