#include <iostream>
#include <queue>
typedef long long ll;
using namespace std;
int main(){
//要把一根木头锯成n段,给出每一段的长度,每锯一次的代价是锯成两段前
//对应的长度,问n-1次按怎样的顺序锯使得代价最小
//流程反一下,就是将n段木头拼成一段,可以将任意两段木头拼在一起
//哈夫曼树的问题,最小的两个元素相加得到的新的元素插到序列之中,
//继续找最小的两个元素,重复以上操作
int n;
cin>>n;
int x;
ll sum=0;
priority_queue<int,vector<int>,greater<int> > Q;
for(int i=0;i<n;i++)
{
cin>>x;
Q.push(x);
}
int t;
while(Q.size()!=1)
{
t=Q.top();
Q.pop();
t+=Q.top();
sum+=t;
Q.pop();
Q.push(t);
}
cout<<sum;
}
数据结构 哈夫曼树
最新推荐文章于 2024-07-10 22:49:54 发布