VIPテスト質問基本演習ハフマンツリー(C言語)(詳細説明)

問題の説明

  ハフマンツリーはコーディングで広く使用されています。ここでは、ハフマンツリーの構築プロセスのみを考慮します。
  数のリスト{ pi } = { p 0、  p 1、…、  pn -1}が与えられた場合、 この数のリストを使用してハフマンツリーを構築するプロセスは次のとおりです   。1。{ pi }で最小の2つの数を見つけます。 そして、それらを設定PAPB削除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になります。



入力フォーマット

  入力の最初の行には、正の整数nn <= 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;
}

この質問は貪欲で書くことを示唆していますが、このスカムは貪欲であり、それを書く方法を知らず、恥ずかしいです。

だから私は自分の考え方で書いたのですが、考えたことはありませんでした。

おすすめ

転載: blog.csdn.net/with_wine/article/details/115008992