牧場を修理する(25ポイント)(単純優先キュー)

農夫は牧場の柵の一部を修理したいと思っています。柵を測定したところ、N枚の木が必要であることがわかりました。各木片の長さは整数Liです。 、すなわち、木材の長さは、Liの合計です。

しかし、農民は自分でのこぎりを持っておらず、誰かを使って木を見た報酬は木の長さに比例します。簡単にするために、報酬を製材の長さに等しく設定します。たとえば、長さ20の木材を長さ8、7、5の3つのセグメントに切断するには、最初の木材の鋸引きは20、木材の鋸引きは12と8、2回目の鋸引きは12、長さは12です。7と5に鋸で挽かれた木材の合計コストは32です。木材を初めて15と5に切断する場合、2回目の切断のコストは15で、合計コストは35(32以上)になります。

農民が木材をN個に鋸で切る最小コストを計算するのに役立つプログラムを書いてください。

入力形式:
入力は最初に正の整数N(≤104)を与えます。これは、木材がN個に切断されることを意味します。2行目は、N個の正の整数(≤50)を示し、各木材の長さを示します。

出力形式:
整数を出力します。つまり、木材をN個に切断するための最小コストです。

ここに画像の説明を挿入します

質問のアイデア

1.欲張りアルゴリズムに従って、最終的に支出を最小限に抑えたい場合、全体として最小に達するためにコストが最小になるたびに、この種の問題は、優先度が調整された優先度キューを使用してハフマンをシミュレートできます。木。
2.基本データ型の優先度キューの優先度調整priority_queue <ElemType、Vector <ElemType>、gerater <ElemType >> que; また、データ型が構造体の場合、別の記事で興味があれば見てみましょう。ちなみに、対応する演習を行い、構造体優先度キューの優先度を調整してください。

#include<iostream>
#include<queue>
using namespace std;

int main()
{
    
    
	priority_queue<int, vector<int>, greater<int>> HuffmanTree;	//数越小优先级越高,换成less<int>就是数值越大权值优先级越高

	int n, t;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
    
    
		cin >> t;
		HuffmanTree.push(t);
	}

	int sum = 0;
	while (HuffmanTree.size() != 1)
	{
    
    
		int t1, t2;				//让数值最小的先出队
		t1 = HuffmanTree.top();
		HuffmanTree.pop();
		t2 = HuffmanTree.top();
		HuffmanTree.pop();
		sum += t1 + t2;
		HuffmanTree.push(t1+t2);	//将新的节点加入到优先队列中
	}

	cout << sum;
}

おすすめ

転載: blog.csdn.net/xdg15294969271/article/details/114000344