标题
huffman编码
时间限制
2 S
内存限制
10000 Kb
问题描述
假设用于通信的电文由n(4<n<30)个字符组成,字符在电文中出现的频度(权值)为w1w2…wn,试根据该权值序列构造哈夫曼树,并计算该树的带权路径长度。
问题输入
一组数据,第1行为n的值,第2行为n个整数,表示字符的出现频度。
问题输出
输出一个整数,表示所构造哈夫曼树的带权路径长度。
输入样例
8
7 19 2 6 32 3 21 10
输出样例
261
思路:
1.算是一条性质吧:哈夫曼树带权路径长度等于所有新生成结点数值之和
2.利用升序优先队列,每次取出来前两个(最小的),将和重新push进优先队列,直到size==1
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
priority_queue<int,vector<int>,greater<int>> pq;
int main(){
int n,weight,num1,num2,result=0;
cin>>n;
for(int i=0;i<n;i++){
cin>>weight;
pq.push(weight);
}
while(pq.size()>1){
num1=pq.top();
pq.pop();
num2=pq.top();
pq.pop();
pq.push(num1+num2);
result+=(num1+num2);
}
cout<<result;
return 0;
}
ps:如有错误敬请指正,如有问题欢迎评论区讨论或私信。如果未及时回复请微信私聊我。
微信号: z1654407501
如果对你有用的话,请点赞并关注支持一波.