從大到小:
priority_queue: 預設
9 8 5 3 2
由小到大:
priority_queue, greater>
2 3 5 8 9;
問題描述
huffman樹在編碼中有著廣泛的應用。在這裡,我們只關心huffman樹的構造過程。
給出一列數=,用這列數構造huffman樹的過程如下:
1. 找到中最小的兩個數,設為pa
和pb,將pa
和pb從中刪除掉,然後將它們的和加入到中。這個過程的費用記為pa
+ pb
。
2. 重複步驟1,直到中只剩下乙個數。
在上面的操作過程中,把所有的費用相加,就得到了構造huffman樹的總費用。
本題任務:對於給定的乙個數列,現在請你求出用該數列構造huffman樹的總費用。
例如,對於數列=,huffman樹的構造過程如下:
1. 找到中最小的兩個數,分別是2和3,從中刪除它們並將和5加入,得到,費用為5。
2. 找到中最小的兩個數,分別是5和5,從中刪除它們並將和10加入,得到,費用為10。
3. 找到中最小的兩個數,分別是8和9,從中刪除它們並將和17加入,得到,費用為17。
4. 找到中最小的兩個數,分別是10和17,從中刪除它們並將和27加入,得到,費用為27。
5. 現在,數列中只剩下乙個數27,構造過程結束,總費用為5+10+17+27=59。
輸入格式
輸入的第一行包含乙個正整數n(n
<=100)。
接下來是n個正整數,表示p
0, p
1, …, pn
-1,每個數不超過1000。
輸出格式
輸出用這些數構造huffman樹的總費用。
樣例輸入
5
5 3 8 2 9
樣例輸出
59
問題描述huffuman樹中,我們已經很清楚題意了, 兩個小的數求和,和再放進原來的數列,而兩個數卻不再放進來。重複操作直到數列只剩下乙個數,
輸出每兩個數的和的總和,就是huffman樹的總費用。可以用貪心的思想,每次都取最小的兩個,找最小的兩個用sort或者選擇排序都可以(可以嘗試一下),這裡我採用優先佇列處理問題,簡單快捷。
1 #include2 #include3using
namespace
std;
4int
main()517
for(i=0; i)
1821
while(que.size()>1)//
一直迴圈到1,直到只剩下乙個數。
2230 printf("%d"
,ans);
31return0;
32 }
知識 優先佇列(堆)
標頭檔案 include queue 大根堆定義 priority queue int pq大根堆另一種定義 priority queue,less q 大根堆 小根堆定義 priority queue int vector int greater int pq 注意最後兩個 符號不要連在一起,否則...
優先佇列基礎知識 四 二項佇列
本文主要分析二項佇列。這個優先佇列結構也是為了處理對數時間合併兩個優先佇列而提出來的。它可是保證平均插入時間為常數。同時合併,刪除最小元操作的最壞時間為o logn 這比左式堆更優,左式堆和斜堆是沒辦法實現平均插入時間是常數時間的。二項佇列是通過樹結構來實現的,我們在乙個樹節點中儲存關鍵字,它的右兄...
優先佇列的基礎知識
優先佇列概念 優先佇列是佇列的一種,不過它可以按照自定義的一種方式 資料的優先順序 來對佇列中的資料進行動態的排序每次的push和pop操作,佇列都會動態的調整,以達到我們預期的方式來儲存。例如 我們常用的操作就是對資料排序,優先佇列預設的是資料大的優先順序高所以我們無論按照什麼順序push一堆數,...