思路:这到题用到了哈弗曼思想,但是纯粹的哈夫曼树会超时,主要是在每次排序插入的时候超的,所以可以想到优先队列优化,求出哈夫曼树的带权路径长度
就是答案---
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
typedef long long ll;
const int maxn=20005;
priority_queue<ll,vector<ll>,greater<ll> >Q;
ll w[maxn];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>w[i];
Q.push(w[i]);
}
long long sum=0;
while(Q.size()>1)
{
long long a=Q.top();
Q.pop();
long long b=Q.top();
Q.pop();
sum+=a+b;
Q.push(a+b);
}
cout<<sum<<endl;
return 0;
}