*【堆】哈夫曼树[scy]
该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。
【题意】
哈夫曼树()在编码中有着广泛的应用。在这里,我们只关心哈夫曼树的构造过程。
给出个数的列数,用这列数构造Huffman树的过程如下:
(1). 找到中最小的两个数,设为和,将和从数列中删除掉,然后将它们的和加入到数列中。这个过程的费用记为。
(2). 重复步骤(1),直到数列中只剩下一个数。
在上面的操作过程中,把所有的费用相加,就得到了构造哈夫曼树的总费用。
本题任务:对于给定的一个数列,现在请你求出用该数列构造Huffman树的总费用。
【输入格式】
第一行一个正整数 ()。
下来个正整数。
【输出格式】
输出一行一个整数,即数列构造哈夫曼树的总费用。
5
5 3 8 2 9
59
【样例解析】
数列 {}={},Huffman树的构造过程如下:
- 找到{5 , 3 , 8 , 2 , 9}中最小的两个数,分别是2和3,从{pi}中删除它们并将和5加入,得到{5 , 8 , 9 , 5},费用为5。
- 找到{5 , 8 , 9 , 5}中最小的两个数,分别是5和5,从{pi}中删除它们并将和10加入,得到{8 , 9 , 10},费用为10。
- 找到{8 , 9 , 10}中最小的两个数,分别是8和9,从{pi}中删除它们并将和17加入,得到{10 , 17},费用为17。
- 找到{10 , 17}中最小的两个数,分别是10和17,从{pi}中删除它们并将和27加入,得到{27},费用为27。
- 现在,数列中只剩下一个数27,构造过程结束,总费用为5+10+17+27=59。