构建N个节点哈夫曼树需要合并N-1次。
方法一:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 105;
int buf[maxn];
int main(){
int n;
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++){
scanf("%d",&buf[i]);
}
int sum = 0,num;
for(int i=1;i<n;i++){//n-1次合并
sort(buf+i-1,buf+n);
num = buf[i-1]+buf[i];
sum = sum+num;
buf[i] = num;
}
printf("%d\n",sum);
}
}
方法二:STL的优先队列
#include<bits/stdc++.h>
using namespace std;
priority_queue<int,vector<int>,greater<int> > Q;
int main(){
int n;
while(scanf("%d",&n)!=EOF){
while(Q.empty()==false){
Q.pop();
}
for(int i=0;i<n;i++){
int a;
scanf("%d",&a);
Q.push(a);
}
int sum= 0;
for(int i=1;i<n;i++){//n-1次合并
int a,b;
a = Q.top();
Q.pop();
b = Q.top();
Q.pop();
sum = sum+a+b;
Q.push(a+b);
}
printf("%d\n",sum);
}
return 0;
}