タイトル
思考
私は、トライ木と貪欲な側面を開始したいです
しかし、男の巨大な部屋をコーチングした後、私は実際にハフマン木を書きました
私たちは、実際にはポイントが倍の右の数は、それが表示されていることで、すべての単語がポイントである、と考えることができます
大きなは貪欲、右の点を考えるのは非常に簡単を持って、彼は小さな長さを持っている必要があります
私たちは、この方向で考えていき、私たちは、各ポイントのための特定の番号がわかりません
すべての私達の必要性は、その外観と番号の長さの倍の数であります
私たちは、最小最長秒に到達する必要があるため
実際には、我々は、合併のツリーに抽象化の数を処理することができます
ツリーは、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;
}