このアルゴリズムは、合併の石(大規模データ版)の問題を解決するために使用することができます。
ロサンゼルスの谷のトピック:P5569 [SDOI2008]石がマージ
石の束(チェーン)の場合:
右の[K] <=石[K + 2]、次いで合わせた石[K + 1] + =石[K]左まで離れ開始から1石。
石まで前方[J]>石[K] +石[K + 1]とjの後ろに配置新しい組み合わせの数を移動する2. K
そのようなjが前面に、存在しないしない場合
3.我々は[N - 1]、石[n]と石である合併の最後の2つの数値を例えばKを見つけることができない場合(明らかに2つの数値が最も小さいです)
4.最初のステップを繰り返します。
コードは以下の通りであります:
1 / * 2 2019年10月30日 3 P5569 [SDOI2008]石子合并 4 czq 5 * / 6 7の#include <cstdioを> 8の#include <iostreamの> 9の#include <アルゴリズム> 10 使用 名前空間STD。 11 のconst int型 N = 4E4 + 10 。 12 13 INT N。 14 int型の石[N]。 15 16 のint main()の 17 { 18 CIN >> N。 19 のための(int型I = 1は、<= N-I; I ++)scanfの(" %Dを"&ストーン[I]); 20は 21である // 記録答えANS、左端の添字の左側の代表的な 22である INT ANS = 0、左= 1。; 23は、 24 // すなわち、少なくとも三つのロックフィル深夜がある場合、1-N-N-左。 25を 一方(左<N-- 1。 ) 26は 、{ 27 のint K; 28 用(左K =; K <N - 1。 ; K ++ ) 29 { 30 IF(石[K] <石= [K + 2 ]) 31れます { 32 ストーン[k個の+ 1 ] + =石[K]; // マージ 33である [k個の+ ANS石+ = 1 ]; // 回答に加え 34である // 右の左にkはk個の上書きする 35 ため(INT J = K; J>左; Jが、)ストーン[J] =石[J - 1 ]; 36 ++左; // そう左へシフトプラス1は 37 38である // アップも左と第二段階は、 39 INT J = K用+ 1 ; 40 ながら(石[J]>ストーン[J- 1 ] && J>左) 41である { 42である // 交換、新たな複合石の前方への移動 43が スワップ(石[J]、石[J- 1 ]); 44である J - ; 45 } 46れる BREAK ; 47 } 48 } 49 // なしKある 50 IF(N-K == - 1 ) 51は 、{ 52である // 最後から二番目の反応器に添加右端石は、 53である 石[N - 1 ] + = 石[N-]; 54である //右端の石と相まって、砂利右端が存在しないので、-N 55 ANS石+ = [ - N - ]; 56である } 57である } 58 59 // プラス石の残りの二つの山 60 ANS石= + [N-] +石[N- 1 ]; 61は、 62である COUT ANS << << ; ENDL 63が 64 リターン 0 ; 65 }
コードは、例を参照して読まれていない場合
次に、実施例1 =左のn = 6のANS = 0 dは新しいマージの数である:石が存在すると仮定6を重ね
コードの実行ショット:
ランダムな例が引用され、あなたはそれを自分で理解することができ、非常に良いではありません