P1090 [NOIP 2004 提高组] 合并果子 - 洛谷
哈夫曼树编码 板子题
最优二叉树,带权路径长度最短的二叉树。 每次找最小的两堆合并
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
//哈夫曼编码 小根堆
priority_queue<int,vector<int>,greater<int> > pq;
for(int i=0;i<n;i++)
{
int a;
cin>>a;
pq.push(a);
}
int ans=0;
while(!pq.empty())
{
int a=pq.top();
pq.pop();
int b=pq.top();
pq.pop();
ans += a+b;
if(pq.empty())break;
pq.push(a+b);
}
cout<<ans<<endl;
return 0;
}