組み合わせたフルーツ
タイトル
[luogu1090]
タイトル説明
果樹園では、ロットが異なる山にすべての果物、果物の異なる種類を撃墜しています。私たちは、たくさんの果物にすべての合成杭を置くことにしました。
各組み合わせ、果実ロットを一緒に組み合わせることができる杭は、果物および杭の重量に等しい物理的強度を消費します。図から分かるように、すべての果物を左パイルに、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であることを保証します。
サンプル入力と出力
入力#1をコピーします
3。
1 2 9
出力#1のコピー
1つ
の説明/プロンプト
データの30%を、n≤1000を確認してください。
データの50%、n≤5000を確保します。
すべてのデータについて、n≤10000を確保します。
分析
意思決定単調。
この質問と[luogu1880石を組み合わせ]の類似点
しかし、二つは全く違う質問です、この質問は、任意の2つの山をマージすることができますし、石のみ隣接する合併をマージすることができます。
しかし、この違い、二つの異なる質問があります
合併の果物のために、各貪欲は答えの顔に最初の合併はもう少し貢献していきます後、組み合わせ番号が同じで、とにかく、最小の2つの山を選択することができ、それが第1の小マージする必要があります。
しかし、唯一の隣接する山が2つの山の最小値であることを保証することはできませんマージので、石の統合のために、貪欲することはできませんが、統合が隣接間隔で、間隔は規制措置のために、より適しているであろう
私たちは、この質問の決定は単調で、合併の果物に戻り、それぞれの選択:
1.二つの数は、元の列の最小数であります
2.合併は、最小の番号2を持っていました
3.前に合併、合併ではありません
堆積物がマージされていなかった私たちは、2つのキューを使用して、合併は、預金を持っていました
今、マージソートしていませんでした
彼らは大に小さいので、大型の一定の割合を追加した後に参加するため
これは、単調2つのキューを保証します
コード
1 / * *********************** 2 ユーザー:Mandy.HY 3 言語:C ++ 4 問題:luogu1090 5 アルゴリズム: 6 ****** ***************** * / 7の#include <ビット/ STDC ++ H> 8 9 使用して 名前空間STDを、 10 11 のconst int型 MAXN = 1E4 + 5 。 12 13 のint nは、L1、R1、L2、R2; 14の 長い 長いANS; 15 長い 長いQ [MAXN]、[MAXN]。 16 17テンプレート< クラスT>インラインボイドリード(T&X){ 18 、X = 0。ブールフラグ= 0。チャー CH = GETCHAR()。 19 しばらく(!isdigit(CH))旗| = CH == ' - '、CH = getchar関数(); 20 一方(isdigit(CH))X =(X << 1)+(X << 3)+(CH ^ 48)、CH = GETCHAR()。 21 場合(フラグ)= X - X。 22 } 23 24テンプレート< クラス T> ボイド putch(CONST T x)から{ 25 であれば(X> 9)putch(X / 10 )。 26 のputchar(X%の10 | 48 )。 27 } 28 29テンプレート< クラス T> ボイド PUT(CONST T X){ 30 であれば(X < 0)のputchar(' - ')、putch( - X)。 31 他putch(X)。 32 } 33 34 空隙ファイル(){ 35 freopenは(「テストデータ(1).IN" " R "STDIN); 36 // freopenは(" 1090.out」、 "R"、STDIN); 37 } 38 39 空隙リードデータ(){ 40 リード(n)は、 41 のために(int型 iは= 1。 I <= N; ++ I){ 42 リード([I]); 43 } 44 } 45 46 空隙ワーク(){ 47 、L1 = 1、R1 = N + 1 ; 48 ソート(A + 1、+ 1 + N)。 49 L2 = R2 = 0 。 50 のために(int型 i = 1 ; iがN <++ {i)が 51 長い 長 X1、X2、X3、X4、X = 0 。 52 であれば(L1 <R1)X1 = [L1]。 53 他 X1 = 1E15; 54 であれば(L1が<R1- 1)X2 = L1 + 1 ]。 55 他 X2 = 1E15; 56 であれば(L2 <R2)X3 = Q [L2]。 57 他の X3 = 1E15; 58 もし(X3>X1){ 59 X + = X1、L1 ++ ; 60 IF(X3> X2)X + = X2、L1 ++ ; 61である 他 X + = X3、L2 ++ ; 62である } 他{ 63は X + = X3; L2 ++ ; 64 IF(L2 < R2)X4 = Q [L2]; // ここでL2は++有する 65 他の X4 = 1E15; 66 IF(X4 <X1)X + = X4、L2 ++ ; 67 他 X + = X1、L1 ++ ; 68 } 69 Q [ ++ R2 =のX; 70 ANS + =バツ; 71 } 72 PUT(ANS)。 73 } 74 75 INT メイン(){ 76 // ファイル()。 77点の リードデータ()。 78 ワーク()。 79 リターン 0 ; 80 }