題目描述
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。
輸入輸入的第一行包含乙個正整數n(n< =100)。
接下來是n個正整數,表示p0, p1, …, pn-1,每個數不超過1000。
輸出輸出用這些數構造huffman樹的總費用。
樣例輸入
55 3 8 2 9
樣例輸出
59想自己動手寫寫堆排序。
總結:插入元素是下濾,刪除元素是上濾。
公升序陣列的話用大根堆,降序用小根堆
//huffuman樹構造,優先佇列的想法
#include
#include
#include
#include
using
namespace std;
//priority_queue,greater> q;
int n;
int a[
1005];
int sum =0;
//堆排序核心模板訓練
// inset操作
void
minheapfixup
(int a,
int i)
//小頂堆的插入操作,插入第i個節點,上濾
a[i]
= temp;
}void
minheadaddnumber
(int a,
int n,
int nnum)
// delete操作
void
minheapfixdown
(int a,
int i,
int n)
//第i個節點,下濾
a[i]
= temp;
}void
minheapdelete
(int a,
int n)
//刪除堆頂元素
void
minheapsort
(int a,
int n)
//小頂堆排 比較重要的一點是公升序用大根堆,降序用小根堆
for(
int i = n-
1;i>
0;i--
)//再進行使他變成小頂堆
}void
print()
intmain()
int num = n;
if(num==1)
while
(num!=1)
cout
}
暑假假期訓練總結 8
今天的話,畢竟大多都是複習了,感覺看的還是比較快的,回顧之前的知識,有沒總結完的,今天也在總結了一下,還有之前沒有接觸過的比如畢達哥拉斯三元組,這個東西之前就沒接觸過,還包括幾類不定方程,還有就是改了改之前的模板把,發現那些大神們有的問題的 實現比之前的好多了,好理解,好實現,就把之前的改了,比如之...
暑假訓練8月6日總結
今天看了關於整除 同餘 擴充套件歐幾里得 中國剩餘定理 素數及尤拉函式的部落格,真的是發現隨著學習數論的時間的增加,對它的認識和用法及模板才越來越清楚。研究了大部分部落格裡面的題目,發現有些東西大多是模板的變式,能熟練掌握該知識 並對模板 很熟練才能舉一反三把變式題看透。最大的感受是今天很充實吧,時...
暑假訓練8月23日總結
隨著校園裡人越來越多,於是我知道快要開學了。對於開學,有種複雜的心情,不知道該怎麼說,課業繁忙,各種各樣的事,好的壞的,都會和自己打個照面。看演算法也是一件單純的事,不喜歡太過麻煩的事情。今天還是看的數字dp,看一編有一遍的收穫吧,從最初的看不太懂,到現在逐漸明白,也算是一種進步,但還是要繼續看,抽...