huffuman樹
description
huffman樹在編碼中有著廣泛的應用。在這裡,我們只關心huffman樹的構造過程。
給出一列數 = ,用這列數構造huffman樹的過程如下:
找到中最小的兩個數,設為 pa 和 pb,將 pa 和 pb 從 中刪除掉,然後將它們的和加入到 中。這個過程的費用記為pa + pb。
重複步驟1,直到 中只剩下乙個數。
在上面的操作過程中,把所有的費用相加,就得到了構造huffman樹的總費用。
本題任務:對於給定的乙個數列,現在請你求出用該數列構造huffman樹的總費用。
例如,對於數列 = ,huffman樹的構造過程如下:
找到中最小的兩個數,分別是2和3,從中刪除它們並將和5加入,得到,費用為5。
找到中最小的兩個數,分別是5和5,從中刪除它們並將和10加入,得到,費用為10。
找到中最小的兩個數,分別是8和9,從中刪除它們並將和17加入,得到,費用為17。
找到中最小的兩個數,分別是10和17,從中刪除它們並將和27加入,得到,費用為27。
現在,數列中只剩下乙個數27,構造過程結束,總費用為5+10+17+27=59。
input
多測試用例,每個測試用例的第一行是乙個正整數 n( n ≤ 100000 )。
接下來是n個正整數,表示p0, p1, …, pn-1,每個數不超過1000。
output
每個測試用例輸出一行:用這些數構造huffman樹的總費用。
sample input
553
829
sample output
59
author
john
相信大家看題目都知道怎麼建哈夫曼樹的,如果還不懂也沒關係,點這裡(**詳解不懂都不行,寫的太好了)
現在雙手呈上本題**:
#includeusing namespace std;
priority_queue, greater > q;//小頂堆 公升序
int main(void)
for(int i=1;i<=n;i++)
sum=0;
//建立哈夫曼樹
while(q.size()>1)
//也是計算最優二叉樹的權值
printf("%d\n",sum);
} return 0;
}
**很短,我們使用到了優先佇列(優先佇列可以理解為堆,好像說堆是優先佇列的一種實現方式,就是一種可以很快拿出最小值的資料結構)來建立(說是建立哈夫曼樹,其實個人理解是計算而不是建立,為什麼是「計算」呢,因為最後優先佇列q只剩下乙個點,但這個過程充分體現並利用了哈夫曼樹的建立過程)哈夫曼樹。 計算集合的並
題目 問題描述 給你兩個集合,計算其並集,即 注 中不允許出現重複元素,但是 與 之間可能存在相同元素。輸入格式 輸入資料分為三行,第一行有兩個數字 n,m 0 include include using namespace std intmain bool flag false for set i...
計算集合的並
description 給你兩個集合,計算其並集,即 注 中不允許出現重複元素,但是 與 之間可能存在相同元素。input 輸入資料分為三行,第一行有兩個數字 n,m 0output 輸出一行資料,表示合併後的集合,要求從小到大輸出,每個元素之間用乙個空格隔開。sample input 1 1 21...
計算集合的並
description 給你兩個集合,計算其並集,即 注 中不允許出現重複元素,但是 與 之間可能存在相同元素。input 輸入資料分為三行,第一行有兩個數字 n,m 0output 輸出一行資料,表示合併後的集合,要求從小到大輸出,每個元素之間用乙個空格隔開。sample input 1 1 21...