プライオリティキューフルーツ貪欲_ _合併

タイトル説明

    果樹園では、ロットが異なる山にすべての果物、果物の異なる種類を撃墜しています。私たちは、たくさんの果物にすべての合成杭を置くことにしました。 
    各組み合わせ、果実ロットを一緒に組み合わせることができる杭は、果物および杭の重量に等しい物理的強度を消費します。図から分かるように、すべての果物を左パイルに、N-1回後に混合しました。体力の果実合計消費の多くはそれぞれの和に等しいときに消費組み合わせます。 
    しかし、また、これらの果物は、可能な限りマージ果物の間にエネルギーを節約するのに最適な家に戻って移動するための努力、そう多くを作るため。番号やフルーツフルーツ重量の各タイプの数は、それぞれ1であると仮定し、それが実を知られている、あなたのタスクは、物理的な体力の多くの費用とコスト最小値を出力最小限に組み合わせたプログラムの順序を、設計することです。 
    例えば、果実の3種類は、数1,2,9が続きます。1,2-スタックはまず、新しいスタック3,3課税の数を組み合わせることができます。その後、新たなスタック及び第3積層体は、元の組み合わせ、および新しいスタックの数は12が課税され、12で得ました。したがって、総課税= 3 + 12 = 15のたくさん。図15は、物理的なコストの最小値ことを示すことができます。

 

エントリー

入力は、2つの行で構成され、最初の行は、整数N(1 <= N <= 10000)であり、果実の種類の数を表します。二行目は、スペースで区切られたn個の整数を含んで、iは愛整数(1 <= AI <= 20000)は、i番目の果実の数です。

 

輸出

単一の整数を含む出力ライン、最小の物理的コストのすなわち値を含みます。入力データがこの値未満で2 ^ 31であることを保証します。

 

サンプル入力

3 
1 2 9

サンプル出力

15 



1、宣言キュー:  PRIORITY_QUEUE <T、ベクトル<T>、CMP> Q;
2、3番目のパラメータが示されている意味である:場合!CMP、行の最初のうち。比較構造は、小から大へと大から小へ、それぞれ、<T>とgetear <T>以下の代わりであってもよいです。
図3は、貪欲な考えは、全複合時刻n-1を必要とする場合、全体の最小コストは、最小コストは、物理スタック一緒に毎回必要とされるように力。
図4は、それぞれ後にエンキュー並べ替えを避けるために、最小の構成要素、要素、その後チームに合成をデキューごとに2つのプライオリティキューの使用は、実行すべき配列を使用します。


 
1の#include <cstdioを>
 2の#include <キュー>
 3  使用して 名前空間STDを、
4 PRIORITY_QUEUE < 長い 長い 整数、ベクトル< 長い 長い 整数 >、<大きい長い 長い 整数 >> Q。
5  INT ()メイン
 6  {
 7      int型N、。
8      長い 長い int型ANS、合計。
9  
10      ながら(〜のscanf(" %d個"、&N)){
 11          和= 0;
12          のためにint型 I = 0を私は++; iがN < {)
 13              のscanf(" %dの"、&​​A )。
14              q.push(A)。
15          }
 16          N-- 17          一方(N-- ){
 18の              ANS = q.top()。
19              q.pop()。
20の              ANS + = q.top()。
21              q.pop()。
22              和+ = ANS。
23              q.push(ANS)。
24         }
 25          ながら(!q.empty())
 26              q.pop()。
27          のprintf(" %LLDする\ n " 、合計)。
28      }
 29  
30      戻り 0 ;
31 }
コードの表示
 

 

 



おすすめ

転載: www.cnblogs.com/konoba/p/11304354.html