問題描述
Huffman樹在編碼中有著廣泛的應(yīng)用。在這里,我們只關(guān)心Huffman樹的構(gòu)造過程。
給出一列數(shù){pi}={p0,p1, …,pn-1},用這列數(shù)構(gòu)造Huffman樹的過程如下:
1. 找到{pi}中最小的兩個數(shù),設(shè)為pa和pb,將pa和pb從{pi}中刪除掉,然后將它們的和加入到{pi}中。這個過程的費用記為pa+pb。
2. 重復(fù)步驟1,直到{pi}中只剩下一個數(shù)。
在上面的操作過程中,把所有的費用相加,就得到了構(gòu)造Huffman樹的總費用。
本題任務(wù):對于給定的一個數(shù)列,現(xiàn)在請你求出用該數(shù)列構(gòu)造Huffman樹的總費用。
例如,對于數(shù)列{pi}={5, 3, 8, 2, 9},Huffman樹的構(gòu)造過程如下:
1. 找到{5, 3, 8, 2, 9}中最小的兩個數(shù),分別是2和3,從{pi}中刪除它們并將和5加入,得到{5, 8, 9, 5},費用為5。
2. 找到{5, 8, 9, 5}中最小的兩個數(shù),分別是5和5,從{pi}中刪除它們并將和10加入,得到{8, 9, 10},費用為10。
3. 找到{8, 9, 10}中最小的兩個數(shù),分別是8和9,從{pi}中刪除它們并將和17加入,得到{10, 17},費用為17。
4. 找到{10, 17}中最小的兩個數(shù),分別是10和17,從{pi}中刪除它們并將和27加入,得到{27},費用為27。
5. 現(xiàn)在,數(shù)列中只剩下一個數(shù)27,構(gòu)造過程結(jié)束,總費用為5+10+17+27=59。
輸入格式
輸入的第一行包含一個正整數(shù)n(n<=100)。
接下來是n個正整數(shù),表示p0,p1, …,pn-1,每個數(shù)不超過1000。
輸出格式
輸出用這些數(shù)構(gòu)造Huffman樹的總費用。
樣例輸入
5
5 3 8 2 9
樣例輸出
59
解題思路:
? ? ? ? 用一個List保存輸入的數(shù)據(jù),循環(huán)對list進(jìn)行操作,先找到兩個最小值,list中找最小值的方法是Collections.min(list),注意這里要用Integer接收,因為在移除時如果是int,remove()移除掉的是下標(biāo),而Integer移除的就是最小的數(shù)。再將兩個最小數(shù)之和加入到list中,再加到sum中,直到list中只有一個元素。最后輸出sum即可。
源代碼:
