まず、実験的な要件の対象
アプリケーションの基本的な原理及び範囲の貪欲アルゴリズムに精通している1、。
2、貪欲なアルゴリズムを使用すると、ハフマン符号化をプログラミングできます。
第二に、実験的なコンテンツ
ハフマン符号化プログラミング、および試験例を提供
第三に、イデオロギー的な達成するために
プライオリティキューデータ構造を使用して、我々はコーディングのk-aryのハフマンを検討している大きな深さは、数は、加えて、より大きな優先度の高いキューの優先順位の値を加算されますので、最大のコストは、確かにバイナリ状況です;最小コストおよびkはフォークですが、2つのフォーク異なる時間で、我々は、kは、その後、確かに、小さい最後のフォークより最適な解決策ではない場合、我々はできる、考えることができます追加した方法により、最後の時間を作る0 (K-1)新しい要素は、実現することができます。
第四に、実装コード
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define mmax 999
int stone[mmax];
int max_stone(int n,int k){
priority_queue<int > q;
//生成最大优先队列
for(int i=0;i<n;i++)
q.push(stone[i]);
int sum=0;
int max=0;
//求解最大的石子分流数目 分流次数越多越好
while(q.size()>2){
sum=0;
for(int i=0;i<2;i++)
{
sum+=q.top();
q.pop();
}
max+=sum;
q.push(sum);
}
while(!q.empty()){
max+=q.top();
q.pop();
}
return max;
}
int min_stone(int n,int k){
priority_queue<int ,vector<int>,greater<int> > q;
//生成最小优先队列
int m=(n-1)%(k-1);
n=n+(k-1-m)%(k-1);
//补充0
for(int i=0;i<n;i++)
q.push(stone[i]);
int sum=0;
int min=0;
//求解最小的石子分流数目 分流次数越少越好
while(q.size()>k){
sum=0;
for(int i=0;i<k;i++)
{
sum+=q.top();
q.pop();
}
min+=sum;
q.push(sum);
}
while(!q.empty()){
min+=q.top();
q.pop();
}
return min;
}
int main()
{
int n,k;
cin>>n>>k;
for(int i=0;i<n;i++)
cin>>stone[i];
cout<<max_stone(n,k)<<" "<<min_stone(n,k)<<endl;
return 0;
}
//7 3
//45 13 12 16 9 5 22