フォーチュン左フランス4ベーシスclass7-タイトルカット地金の問題

フォーチュン左フランス4ベーシスclass7-タイトルカット地金の問題

1.トピック

地金を半分に切断し、銅板の長さと同じ値をとります。例えば、20金の延べ棒の長さは、20銅を費やす必要があり、関係なく、どのくらいの長さの半分に切ります。金地金のブロック全体を分割したい人々のグループは、どの州で最も銅を分割するには?
例えば、3つの合計を表す配列{10、20}、所与、バー10 + 20 + 30 = 60地金の全体の長さは、3つの部分10,20,30に分割します。50に第一のバー10及び60の長さは、60は20及び30の長さに、次いでバー50とを取る場合、総コストは50 110銅を過ごしました。しかし、第一のバー30と60 30に、60の長さは、10にバー30と20の長さを取る場合は、30が90費やした銅の合計を過ごしました。
入力アレイ、分割されたリターン最小コスト。

2.分析

標準ハフマン符号化問題:子ノードのコストは、マージと
貪欲な戦略
ここに画像を挿入説明
すべての非リーフノードと30 + 60 = 90がこの質問を解決します。最も低コストのアプローチを生成:
①に追加されたすべての数字の小さなヒープルート
ごとに2つの数のうちの②、それがマージを元に戻す
その数は価格である、唯一の番号まで③

3.完全なコード

#include<queue> 
#include<iostream>
using namespace std;
int main()
{

	int a[] = {10,20,30};
	vector<int> v(a,a + 3);
	int sum = 0;
	priority_queue<int,vector<int>,greater<int> > pq;
	for(auto c : v)
	{
		pq.push(c);
	}
	while(pq.size() > 1)
	{
		int num1 = pq.top();
		pq.pop();
		int num2 = pq.top();
		pq.pop();
		int cur = num1 + num2;
		sum += cur;
		pq.push(cur);
	}
	cout<<sum<<endl;
	return 0;
}
公開された51元の記事 ウォンの賞賛1 ビュー1365

おすすめ

転載: blog.csdn.net/shi_xiao_xuan/article/details/104818389