问题 1462: [蓝桥杯][基础练习VIP]Huffuman树
生活随笔
收集整理的這篇文章主要介紹了
问题 1462: [蓝桥杯][基础练习VIP]Huffuman树
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述 Huffman樹在編碼中有著廣泛的應用。在這里,我們只關心Huffman樹的構造過程。?
給出一列數{pi}={p0,? p1,? …,? pn-1},用這列數構造Huffman樹的過程如下:?
1.? 找到{pi}中最小的兩個數,設為pa和pb,將pa和pb從{pi}中刪除掉,然后將它們的和加入到{pi}中。這個過程的費用記為pa? +? pb。?
2.? 重復步驟1,直到{pi}中只剩下一個數。?
在上面的操作過程中,把所有的費用相加,就得到了構造Huffman樹的總費用。?
本題任務:對于給定的一個數列,現在請你求出用該數列構造Huffman樹的總費用。?
例如,對于數列{pi}={5,? 3,? 8,? 2,? 9},Huffman樹的構造過程如下:?
1.? 找到{5,? 3,? 8,? 2,? 9}中最小的兩個數,分別是2和3,從{pi}中刪除它們并將和5加入,得到{5,? 8,? 9,? 5},費用為5。?
2.? 找到{5,? 8,? 9,? 5}中最小的兩個數,分別是5和5,從{pi}中刪除它們并將和10加入,得到{8,? 9,? 10},費用為10。?
3.? 找到{8,? 9,? 10}中最小的兩個數,分別是8和9,從{pi}中刪除它們并將和17加入,得到{10,? 17},費用為17。?
4.? 找到{10,? 17}中最小的兩個數,分別是10和17,從{pi}中刪除它們并將和27加入,得到{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
優先隊列 1 #include <bits/stdc++.h> 2 using namespace std; 3 int n,x; 4 int main() { 5 priority_queue<int, vector <int>, greater<int> > pq; 6 while(cin>>n){ 7 for(int i=0;i<n;i++){ 8 cin>>x; 9 pq.push(x); 10 } 11 int sum=0; 12 while(pq.size()>1){ 13 int x1=pq.top(); 14 pq.pop(); 15 int x2=pq.top(); 16 pq.pop(); 17 int y=x1+x2; 18 sum+=y; 19 pq.push(y); 20 } 21 cout<<sum<<endl; 22 } 23 return 0; 24 }
給出一列數{pi}={p0,? p1,? …,? pn-1},用這列數構造Huffman樹的過程如下:?
1.? 找到{pi}中最小的兩個數,設為pa和pb,將pa和pb從{pi}中刪除掉,然后將它們的和加入到{pi}中。這個過程的費用記為pa? +? pb。?
2.? 重復步驟1,直到{pi}中只剩下一個數。?
在上面的操作過程中,把所有的費用相加,就得到了構造Huffman樹的總費用。?
本題任務:對于給定的一個數列,現在請你求出用該數列構造Huffman樹的總費用。?
例如,對于數列{pi}={5,? 3,? 8,? 2,? 9},Huffman樹的構造過程如下:?
1.? 找到{5,? 3,? 8,? 2,? 9}中最小的兩個數,分別是2和3,從{pi}中刪除它們并將和5加入,得到{5,? 8,? 9,? 5},費用為5。?
2.? 找到{5,? 8,? 9,? 5}中最小的兩個數,分別是5和5,從{pi}中刪除它們并將和10加入,得到{8,? 9,? 10},費用為10。?
3.? 找到{8,? 9,? 10}中最小的兩個數,分別是8和9,從{pi}中刪除它們并將和17加入,得到{10,? 17},費用為17。?
4.? 找到{10,? 17}中最小的兩個數,分別是10和17,從{pi}中刪除它們并將和27加入,得到{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
優先隊列 1 #include <bits/stdc++.h> 2 using namespace std; 3 int n,x; 4 int main() { 5 priority_queue<int, vector <int>, greater<int> > pq; 6 while(cin>>n){ 7 for(int i=0;i<n;i++){ 8 cin>>x; 9 pq.push(x); 10 } 11 int sum=0; 12 while(pq.size()>1){ 13 int x1=pq.top(); 14 pq.pop(); 15 int x2=pq.top(); 16 pq.pop(); 17 int y=x1+x2; 18 sum+=y; 19 pq.push(y); 20 } 21 cout<<sum<<endl; 22 } 23 return 0; 24 }
?
轉載于:https://www.cnblogs.com/shixinzei/p/10562679.html
總結
以上是生活随笔為你收集整理的问题 1462: [蓝桥杯][基础练习VIP]Huffuman树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【PMP】项目风险管理~重点知识
- 下一篇: VMware下安装CentOS7 无法通