問題P3620 [[APIO / CTSC 2007]データのバックアップ]へのソリューション

(選択された各最小)貪欲、その後明らかにすべてのサンプルを通過しない直接... 2つの建物は、別の建物は明らかに交差することができないので、好ましくない...第一オリジナルシリーズがに加工されたときに選択さ(すべてのオフィスとの距離で)のn-1の数、対象における[]の存在は、隣接していないK基の数を選択するように求め、そしてその結果、選択された最小数

[]最初の1を選択し、K = 2のGeを選択することが、2126年であればそれでも、その後、何のメソッドは、2回の2選挙を見つけないでしょう貪欲と考えられるが、すべての選挙最小限、我々は恥ずかしい、6を選択しなければなりませんでした図1は、1が2つの山に2 +後で、我々は2-1と同等のものを取ることができます2削除し、スタックを挿入すると、選択されている...我々はそれを選んだ、我々は救済策を検討...拾いましたその2個の2、及びので、ここでは、一つだけ選択したため、2-1 + 2は、二つの数字から選択される表すことができる-1

...問題は、最初または最後の桁数の境界を取るように、存在する場合、[0]が最大値に割り当てられ、[N] ...唱えます

国境の辺の数が唯一の有効な数値であるので、それは、将来のに取られることができない、(時間が数2を是正するために必要な...)是正最大に割り当てることはできません

それは数の前の数字は、数ある保管しなければならない、数が数である(便利削除)

721268は、1を取る、2は両方を削除して、新しいリストを開き、このリスト領域212で置換された[++ n]は、+ 2ストレージ2-1、空間

スペースの新しいリスト、前駆体は7場所で、場所の後継者は7,6前任者と後継者を変更することを忘れないでください... 6 ...

1の#include <iostreamの>
 2の#include <cstdioを>
 3の#include <CStringの>
 4の#include <アルゴリズム> 
 5  の#define N 100009
 6  使って 名前空間STD。
7  int型 N、DIS [N]、LA、lheap、ヒープ[N << 3 ]、POS [N << 3 ]、K、今、点[N << 3 ] [ 2 ]、前、次、
8  長い 長い [N << 3 ]、ANS。
9インラインボイドプッシュ(INT X)
 10  {
 11      のint i = ++ lheap。
12は、      ヒープ[I] =のX;
 13である      POS [X] = I; // スタックの[] x番目の位置を記録するPOSリスト
14      ながら(I> 1 15          IF [ヒープ(Iは] <A [ヒープ[I / 2 ])
 16              {
 17。                  スワップ(ヒープ[I]、ヒープ[I / 2 ]);
 18は、                  スワップ(POS [ヒープ[I]、POS [ヒープ[I / 2 ] ])
 。19                  I >> = 1 ;
 20              }
 21である         他の リターン;
 22れる }
 23は、インラインINTデル(INT X)// 削除された場合ここで、それが割り当てられている唯一の最大値は、スタックが最下位置を詰め、それ〜
24  {
 25      のint I = POS [X];
 26である      [X] = 1E12。
 27      一方、式(I * 2 <= lheap)
 28          {
 29              のint P = Iは、* 2 30              IF([ヒープ[P +は1。 ] <A [ヒープ[P])P ++ ;
 31である             IFヒープ([P ] < A [ヒープ[I])
 32                  {
 33が                     スワップ(ヒープ[I]、ヒープ[P]);
 34であります                     スワップ(POS [ヒープ[I]、POS [ヒープ[P])。
35                      I = P。               
36                  }
 37               破ります38          }
 39  }
 40インラインint型ポップ()
 41  {
 42      のint i = 1、RT =ヒープ[ 1 ]。
43      ヒープ[ 1 ] =ヒープ[lheap-- ]。
44台の      POS [ヒープ[ 1 ] = 1 45      一方、式(I * 2 <= lheap)
 46         {
 47              のint p = iが* 2 48              であれば([ヒープ[P + 1 ] <[ヒープ[P])p ++ 49              であれば([ヒープ[P] < [ヒープ[I])
 50                  {
 51                      スワップ(ヒープ[I]、ヒープ[P])。
52                      スワップ(POS [ヒープ[I]、POS [ヒープ[P])。
53                      I = P。
54                  }
 55              他に 戻り、室温;
56          }
 57      リターンRT。
58  }
 59  のintmain()の
 60  {
 61は     int型I、J、K、
 62である      CIN K >> >> N-DIS [ 1 ];
 63である      [ 0 ;] [N- = 1E12 = // 最大値を割り当て境界。 ..([]は、n-1、明らかに境界N-数であるので)
64      ポイント[ 0 ] [ 1 ] = 1、ポイント[ 0 ] [ 0 ] = 0、ポイント[N-] [ 1 ] = N-、ポイント[N-] [ 0 ] = N- 1。 ; // 説明は説明されている... 
65      プッシュ(0 )、プッシュ(N-);
 66      のための(I = 1 ; Iは、N- <; I ++は67          {
 68              scanfの(" %のD "、&​​DIS [Iは、+ 1。]);
 69              A [I]がDISを= [I +は1。 ] - DIS [I]、
 70              ポイント[I] [ 0 ] = I- 1。;
 71は、              ポイント[ I] [ 1 ] = I +は1 ;
 72              プッシュ(I);
 73である         }
 74  
75      のための(N-ラ=; K; K-- 76          {
 77              ; ANS = A + [今= POP()] // 後に終了ポップヒープが拡大しているので、最初のプッシュは、その要素がポップ・ヒープに残る
78             ポイント= PREV [今] [ 0 ] =次のポイント[今] [ 1 ]; // 最後のアレイ、それはカバーを押すことができる
79              A [++ラ] [PREV] + [次] Aが= - [今];
 80  
81              ポイント[ラ] [ 0 ] =ポイント[PREV] [ 0 ];
 82              ポイント[ポイント[PREV] [ 0 ] [ 1 ] = ラを、
 83              ポイント[ラ] [ 1。 =]ポイント[次] [ 1 ];
 84              ポイント[ポイント[次] [ 1 ] [ 0 ] = ラと、
 85  
86              プッシュ(LA)。// デル前に、プッシュ
87              デル(PREV)、デル(次へ);
 88          }
 89      COUT ANS << << ENDL;
 90 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/Xchu/p/11355880.html