UESTC - 1599
这天,AutSky_JadeKAutSky_JadeK看到了nn张图片,他忍不住说道:“我TMTM社保!”。
每张图片有一个社保值,他可以合并两张图片,合并所得的图片的社保值是原来两张图片的社保值之和。
每次合并需要消耗的体力也是原来两张图片的社保值之和。
显然,n−1n−1次合并之后,只剩下一张图片。
他想知道,在这个过程中,他消耗的总体力最少是多少。
Input
第一行包含一个整数nn,
第二行包含nn个整数A1,A2,…,AnA1,A2,…,An,代表nn张图片的社保值。
Output
输出一行,包含一个整数,代表他消耗的总体力最少是多少。
Sample Input
3 1 2 9
Sample Output
15
Hint
1≤n≤200001≤n≤20000,
1≤Ai≤2000
1 #include <iostream> 2 #include <cstdio> 3 #include <queue> 4 using namespace std; 5 typedef long long LL; 6 const int MAXN = 2e4 + 8; 7 8 priority_queue<LL, vector<LL>, greater<LL>> pq; 9 10 int main() 11 { 12 #ifdef LOCAL 13 freopen("j.txt", "r", stdin); 14 int T = 4; 15 while(T--){ 16 #endif 17 int n, a, i, b; 18 LL ans = 0; 19 scanf("%d", &n); 20 for(i = 0; i < n; i++){ 21 scanf("%d", &a); 22 pq.push(a); 23 } 24 int sz = pq.size(); 25 while(sz >= 2){ 26 a = pq.top(); 27 pq.pop(); 28 b = pq.top(); 29 pq.pop(); 30 a = a + b; 31 ans += a; 32 pq.push(a); 33 sz--; 34 } 35 36 cout << ans << endl; 37 38 #ifdef LOCAL 39 cout << endl; 40 } 41 #endif 42 return 0; 43 }