问题1925--转换哈夫曼编码

1925: 转换哈夫曼编码

时间限制: 1 Sec  内存限制: 128 MB
提交: 5  解决: 2
[提交] [状态] [讨论版] [命题人:]

题目描述

静态哈夫曼编码是一种主要用于文本压缩的编码算法。给定一个由 N 个不同字符组成的特定长度的文本,算法选择 N 个编码,每个不同的字符一个编码。使用这些编码压缩文本,当选择编码算法构建一个具有 N 个叶子的二叉树时,对于 N≥2,树的构建如下:

1. 对文本中的每个不同字符,构建一个仅包含单个结点的树,并为其分配权值,权值与文本中该字符出现的次数一致。
2. 构建一个包含上述 N 棵树的集合 s。
3. 当 s 包含多于一棵树时:
(a) 选择最小的权值 t1∈s,并将其从 s 中删除;
(b) 选择最小的权值 t2∈s,并将其从 s 中删除;
(c) 构建一棵新树 t,t1 为其左子树,t2 为其右子树,并且 t 的权值为 t1、t2 权值之和;
(d) 将 t 加入 s 集合。
4. 返回保留在 s 中的唯一一棵树。
对于文本““abracadabra”,由上述过程生成的树,可以像下图左侧,其中每个内部结点编辑有子树根的权值。请注意获得的树也可以像下图右侧或其它,因为在步骤 3(a)、3(b)中,结合可能包含几个权值最小的树。

对文本中的每个不同字符,其编码取决于最终树中从根到对应字符的叶子之间的路径,编码的长度是这条路径中的边数(与路径中的内部结点一致)。假设该算法构建的是左侧的树,“r”的代码长度为 3,“d”的代码长度为 4。
根据算法选择的 N 个代码的长度,找所有字符总数的最小值。

输入

输入文件包含多个测试用例,每个测试用例如下所述:
第一行包含一个整数 N(2≤N≤50),表示文本中出现的不同字符数。
第二行包含 N 个整数 Li(1≤Li≤50,i=1,2,…,N),表示由 huffman 算法生成的不同字符的编码长度。
假设至少存在一棵上述算法构建的树,可以生成具有给定长度的编码。

输出

对每个测试用例,输出一行,表示所有字符总数的最小值。

样例输入 Copy

2
1 1
4
2 2 2 2
10
8 2 4 7 5 1 6 9 3 9

样例输出 Copy

2
4
89