問題:ホーマー(ハフマン&貪欲)

タイトル

ポータル

思考

私は、トライ木と貪欲な側面を開始したいです

しかし、男の巨大な部屋をコーチングした後、私は実際にハフマン木を書きました

ハフマンについて

私たちは、実際にはポイントが倍の右の数は、それが表示されていることで、すべての単語がポイントである、と考えることができます

大きなは貪欲、右の点を考えるのは非常に簡単を持って、彼は小さな長さを持っている必要があります

私たちは、この方向で考えていき、私たちは、各ポイントのための特定の番号がわかりません

すべての私達の必要性は、その外観と番号の長さの倍の数であります

私たちは、最小最長秒に到達する必要があるため

実際には、我々は、合併のツリーに抽象化の数を処理することができます

ツリーは、k個のフォークでなければなりません

そして、それぞれの層がダウンして展開することができる唯一の1を持つことができます

私たちは、各点の重みの順序を維持するために、プライオリティキューを使用するように、

トップ-Kを除去した後、合併後、次いで、ライン内部ツリーに

私たちは成果を必要としないプロセスを通じて、私たちは唯一の抽象化のプロセスになります

コード

#include<iostream>
#include<queue>
using namespace std;
struct node
{
    int dep;
    long long w;
    friend bool operator < (const node &a,const node &b)
    {
        if(a.w==b.w)
            return a.dep>b.dep;
        return a.w>b.w;
    }
}a[100005];
int n,k;
long long ans;
node cnt[15];
priority_queue<node> q;
int main()
{
    ios::sync_with_stdio(false);
    cin>>n>>k;
    for(int i=1;i<=n;i++)
    {
        long long w;
        cin>>w;
        q.push((node){0,w});
    }
    while((n-1)%(k-1))
    {
        n++; 
        q.push((node){0,1ll*0});
    }
    while(q.size()!=1)
    {
        for(int i=1;i<=k;i++)
        {
            cnt[i]=q.top();
            q.pop();
        }
        node t;
        t.dep=0;
        t.w=0;
        for(int i=1;i<=k;i++)
        {
            t.w+=cnt[i].w;
            t.dep=max(t.dep,cnt[i].dep);
        }
        t.dep++;
        q.push(t);
        ans+=t.w;
    }
    cout<<ans<<' '<<q.top().dep;
    return 0;
}

おすすめ

転載: www.cnblogs.com/loney-s/p/12076863.html