1003. Huffman Coding

Description

美国数学家David Huffman1952年发明了赫夫曼编码,在编码中用到的特殊的二叉树称为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
 Copy sample input to clipboard
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;
}


猜你喜欢

转载自blog.csdn.net/qq_39380075/article/details/78668365