問題の説明
ハフマンツリーはコーディングで広く使用されています。ここでは、ハフマンツリーの構築プロセスのみを考慮します。
数のリスト{ pi } = { p 0、 p 1、…、 pn -1}が与えられた場合、 この数のリストを使用してハフマンツリーを構築するプロセスは次のとおりです 。1。{ pi }で最小の2つの数を見つけます。 そして、それらを設定PAとPB、削除PA及びPB {から PI {にそれらの合計を追加し}、及び PI }。このプロセスのコストは、pa + pbとして記録されます。 2. { pi }に数字が1つだけ残るまで、手順1を繰り返し ます。 上記の操作プロセスでは、すべてのコストが合計されて、ハフマンツリーを構築するための総コストが得られます。 この質問のタスク:与えられたシーケンスについて、シーケンスを使用してハフマンツリーを構築するための総コストを見つけてください。 たとえば、シーケンス{ pi } = { 5、3、8、2、9 }の場合、ハフマンツリーの構築プロセスは次のようになります。
1. { 5、3、8、2、9 }で2と3の2つの最小数を見つけ、それらを{ pi }から 削除し、合計5を{ 5、8、9、5 }に追加します。コストは5です。 2. { 5、8、9、5 } 、5、および5で最小の2つの数値を見つけ、それらを{ pi }から 削除し、合計10を{ 8、9、10 }に加算します。コストは10です。 3. { 8、9、10 }で最小の2つの数値(8と9)を見つけ、それらを{ pi }から 削除し、合計17を{ 10、17 }に追加します。コストは17です。 4. { 10、17 }で最小の2つの数値、つまり10と17を見つけ、それらを{ pi }から 削除し、合計27を加算して{27}を取得します。コストは27です。 5.これで、シーケンスに残っている番号27は1つだけです。構築プロセスは終了し、合計コストは5 + 10 + 17 + 27 = 59になります。
入力フォーマット
入力の最初の行には、正の整数n(n <= 100)が含まれています。
次は、p 0、 p 1、…、 pn -1を表すn個の正の整数であり、各数値は1000を超えません。出力フォーマット
これらの数値を使用して、ハフマンツリーを構築するための総コストを出力します。
サンプル入力
5
5 3 8 2 9サンプル出力
59
私の考えの図:
(コードを見てください)
順序がソートされるたびに、2つの最小の数値の合計が、追加された2つの数値の2番目に更新されます。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[110],b[1010],n,i,j;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);//输入
int sum=0,k=0;
while(k!=n-1)
{
sort(a,a+n);
sum+=a[k]+a[k+1];
a[k+1]=a[k+1]+a[k];
k++;
}
printf("%d",sum);
return 0;
}
この質問は貪欲で書くことを示唆していますが、このスカムは貪欲であり、それを書く方法を知らず、恥ずかしいです。
だから私は自分の考え方で書いたのですが、考えたことはありませんでした。