Merge Fruit C++ の詳細な説明

トピックの説明
果樹園で、Duoduo はすべての果物を倒し、果物の種類ごとに異なる山に分割しました。Duoduo はすべての果物を 1 つの山にまとめることにしました。
Duoduo は結合するたびに 2 つの果物の山を結合することができ、消費されるエネルギーは 2 つの果物の山の重さの合計に等しくなります。すべての果物がn − 1 n-1を通過することがわかります。n1 回マージすると、山は 1 つだけ残ります。フルーツを合成する際に Duoduo が消費するスタミナの合計は、各合成で消費されるスタミナの合計と等しくなります。
これらのフルーツを家に持ち帰るには多大な労力がかかるため、Duoduo はフルーツを結合する際にできる限りエネルギーを節約する必要があります。各果物の重みが 1 で、果物の種類と各果物の数がわかっていると仮定すると、あなたのタスクは、Duoduo のエネルギー消費を最小限に抑える組み合わせシーケンス プランを設計し、この最小エネルギー消費値を出力することです。 。
たとえば、果物が 3 種類あり、数字は順番に 1、2、9 になります。最初に 1 と 2 の杭を結合でき、新しい杭の数は 3 で、エネルギー消費は 3 です。次に、新しい山を元の 3 番目の山と結合して、番号 12、物理的努力 12 の新しい山を取得します。つまり、Duoduo は合計体力 = 3 + 12 = 15 を消費します。15 が最小の身体活動値であることが証明できます。
ここに画像の説明を挿入

入力および出力形式
入力形式:
入力ファイル Fruit.in には 2 行が含まれており、最初の行は果物の種類の数を示す整数 n (1 <= n <= 10000) です。2 行目にはスペースで区切られた n 個の整数が含まれています。i 番目の整数 ai (1 <= ai <= 20000) は i 番目の果物の数です。

出力形式:
出力ファイル Fruit.out には 1 行が含まれており、この行には最小の身体活動値である整数のみが含まれています。入力データは、この値が 231 未満であることを保証します。

入力サンプルと出力サンプル
入力サンプル #1:
3
1 2 9
出力サンプル #1:
15
プロンプト情報
データの 30% については、n <= 1000 であることが保証され、
データの 50% については、n < であることが保証されます。 = 5000;
すべてのデータは n <= 10000 であることが保証されます。

アイデアは非常にシンプルで、並べ替え + 貪欲です。

#include <iostream>
#include <queue>
using namespace std;
priority_queue <int,vector<int>,greater<int> >a;
int n,s,x,y;
int main()
{
    
    
	cin >>n;
	for (int i=1;i<=n;i++)
	{
    
    
		cin >>x;
		a.push(x);
	}
	while (a.size()>=2)
	{
    
    
		x=a.top(); a.pop();
		y=a.top(); a.pop();
		s+=x+y;
		a.push(x+y);
	}
	cout <<s;
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/DUXS11/article/details/132122141
Recomendado
Clasificación