首页 > 代码库 > UESTC 1599 wtmsb

UESTC 1599 wtmsb

这天,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;
}

 

UESTC 1599 wtmsb