藍橋杯 BASIC 28 Huffman樹

2021-09-29 12:07:16 字數 1201 閱讀 3515

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個正整數,表示p0,  p1,  …,  pn-1,每個數不超過1000。 

輸出用這些數構造huffman樹的總費用。 

5 

5 3 8 2 9

59
我是採用乙個公升序排列的優先佇列來進行求解的,用sum來記錄構造huffman樹的總花費。先將所有數放入優先佇列中,不斷地取出優先佇列中最小的倆個值,再將它們的累加和放入佇列中,同時sum不斷地累加它們的累加和,直到佇列中僅剩乙個元素為止。寫完這題後靈感一現,發現前幾天演算法分析與設計實驗課的那道題最優合併問題

也可以用優先佇列來進行求解。

#include using namespace std;

#define up(i,a,b) for(int i = a; i <= b; i++)

int main()

int sum = 0;

while(pq.size() != 1)

cout << sum << endl;

return 0;

}

藍橋杯 BASIC 28 Huffuman樹

基礎練習 huffuman樹 時間限制 1.0s 記憶體限制 512.0mb 問題描述 huffman樹在編碼中有著廣泛的應用。在這裡,我們只關心huffman樹的構造過程。給出一列數 用這列數構造huffman樹的過程如下 1.找到中最小的兩個數,設為pa和pb,將pa和pb從中刪除掉,然後將它們...

藍橋杯BASIC 28 Huffuman樹

markdown寫起來蠻好玩的,再寫一篇試試 資源限制 時間限制 1.0s 記憶體限制 512.0mb 問題描述 huffman樹在編碼中有著廣泛的應用。在這裡,我們只關心huffman樹的構造過程。給出一列數 用這列數構造huffman樹的過程如下 1.找到中最小的兩個數,設為pa和pb,將pa和...

藍橋杯 BASIC題 (持續更新)

basic 13 基礎練習 數列排序 問題描述 給定乙個長度為n的數列,將這個數列按從小到大的順序排列。1 n 200 輸入格式 第一行為乙個整數n。第二行包含n個整數,為待排序的數,每個整數的絕對值小於10000。輸出格式 輸出一行,按從小到大的順序輸出排序後的數列。樣例輸入5 8 3 6 4 9...