Description
美国数学家David Huffman在1952年发明了赫夫曼编码,在编码中用到的特殊的二叉树称为Huffman tree。
给出n个字符在文本中的出现次数,输出文本的Huffman编码长度(即编码后的二进制序列有多少位)。
例如,5个字符出现的次数如下,采用对应Huffman编码可得到最优编码长度为4×5+3×15+1×40+2×30+4×10=205。
对应的Huffman Tree如下:
Input
输入的第1行是字符个数n(0<n<=52);以下n行每行为一个字符c及其出现的次数w(c),之间用一个空格分隔。字符只可能为大小写英文字母,输入保证n个字符各不相同。
Output
单独一行输出Huffman编码长度。
Sample Input
5 A 5 B 15 C 40 D 30 E 10
Sample Output
205
想这道题想了两个小时,一直想着怎么样去构建树
或多或少受到了Description的影响
后来突然灵机一动,为什么要构建树呢,明明就是求最短WPL,上面层的无非就是再加一次下面层的WPL而已
于是有了做法,直接AC,有点懊恼查阅了两个小时资料,浪费了不少时间
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
struct cmp1
{
bool operator ()(int x, int y)
{
return x>y;
}
};
priority_queue<int ,vector<int>,cmp1> que;
int main(){
int num,num1,ans=0;
cin>>num;
char a;
for(int i=0;i<num;i++)
{
cin>>a;
cin>>num1;
que.push(num1);
}
int arr1[520];
int i=0,j=0;
while(!que.empty())
{
arr1[j]=que.top();
que.pop();
j++;
i++;
if(i==2)
{
que.push(arr1[j-1]+arr1[j-2]);
i=0;
ans+=arr1[j-1];
ans+=arr1[j-2];
}
}
cout<<ans<<endl;
}