【分析】 这题没难度,就是哈夫曼编码的题。思想是贪心,用小根堆维护。不过我学习的重点是使用c++ STL的优先队列,以及如何自定义重载运算符。感觉STL真心实用且方便。
#include <cstdio>
#include <queue>
#include <cmath>
using namespace std;
typedef long long ll;
int n;
ll ans;
struct cmp{
bool operator () (ll &a, ll &b){
return a>b;
}
};
priority_queue<ll,vector<ll>,cmp>que;
void init(){
ll x;
while (!que.empty()) que.pop();
for (int i=0; i<n; i++) {
scanf("%lld",&x);
que.push(x);
}
}
void cnt(){
ans = 0;
ll tmp;
while (que.size()>1){
tmp = que.top();
que.pop();
tmp += que.top();
que.pop();
que.push(tmp);
ans += tmp;
}
}
int main(){
while (scanf("%d",&n) && n){
init();
cnt();
printf("%lld\n",ans);
}
return 0;
}
本文介绍了一种使用哈夫曼编码解决最小带权路径长度问题的方法,并重点探讨了C++ STL中优先队列的应用及自定义比较器的实现。
3839

被折叠的 条评论
为什么被折叠?



