哈夫曼樹編碼的應用

題目:例如有3種果子,數目依次爲1,2,9。可以先將1、2堆合併,新堆數目爲3,耗費體力爲3。接着,將新堆與原先的第三堆合併,又得到新的堆,數目爲12,耗費體力爲12。所以多多總共耗費體力=3+12=15。可以證明15爲最小的體力耗費值。(題目默認輸入的數字按從小到大排序)
這個就用到了哈夫曼編碼,類似求權值最小的
#include<iostream>
#include<queue>
#include<vector>;
#include<functional>
using namespace std;
priority_queue<int ,vector<int> ,greater<int> > q;
int main()
{
    int n;scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        int x; scanf("%d",&x);
        q.push(x);
    }
    int ans=0;
    while(n>1)
    {
        int t1=q.top(); q.pop();
        int t2=q.top(); q.pop();
        ans+=t1+t2;
        q.push(t1+t2);
        n--;
    }
    printf("%d\n",ans);
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章