1233:[Usaco2009Open]干し草タワー

ポータル

逆に従事考慮しないことをお勧めているような感覚、

貪欲、貪欲を考えるのは簡単各層は最小幅を選択し、次に$ WAドル見つけ...

 

スタートのために、それは時々小さな幅の層の下に複数の選択を行うことができます

そして、不思議な結論があり、最高1は、基礎となるプログラムが狭いプログラムを持っている必要があります

証明:

行のために、すべてのブロックを考慮し、セクションに分割され、各セクションは、基礎となる仮定は、最も狭い図溶液で、層を示し

底が広くなるように、よりよい解決策があると仮定します。

 次いで、引き出しの原理によれば、中間部分は、少なくとも青赤の2本の分割線を有していなければなりません

あなたは、$ X、Y $としてラベルされたような位置を見つけるかもしれません:

$ Yの$によって分割後、赤色の上部層は、$ Pが$の前に青色で割った以下の層は、中間層は、$ [Pを、Y] $であるように、明らかに、我々は、新しいプログラムを構築することができます

なぜなら$ [P、Y] $ $より$大きい[X、Y]、上位層は、$ [P、Y] $、共感する$より小さくなければならないので、[Pを、Y] $は$ [P、Q] $より小さくなければなりません下層は、$ [P、Y] $より大きくなければなりません。

その後、我々は新しいプログラムの構造は、より多くの層になると、底がまだ狭いプログラムであることがわかりました

だから、基本的なプログラムが最も狭いものを持っている必要がありますことを証明することが最適な解決策であります

DPは、その後、$ $することができるF $を設定する[I] $意味$ I、N $ブロック、底部の最も狭い幅、$ gを維持しながら[i]が$エンドは$ I、Nの$を考え表すとき完了したとみなさブロック、最も狭いの底部の層の最大数

明確次いでJ [iは、$ [I] =分(和[J-1] -sum [i])と$($合計$プレフィックス及びブロック幅)F $を移し、$和を満たす>全て$ jを列挙する-1] -sum [I]> = F [j]は$

決定は、2つの$ K、$ K> jは$、$ K $ $は合法ではないだけの$ J $のj個の$ケース場合よりも良くなるjは$、すなわち$和[J-1] -sum [iについてことが判明しました<F [J] $

そして、$和[i]は$単調に増加するので、単調なキューのメンテナンスの波が$ Oを行うことができるとのように、法的な判断ポイントは、ますます小さくなります(N)$がシフトしているので、

 

#include <iostreamの> 
する#include <cstdioを> 
する#include <アルゴリズム> 
の#include <CStringの> 
する#include <cmath> 
の#include <ベクトル> 
のtypedef 長い LL。
使用して 名前空間はstdを、
インライン読み取り11()
{ 
    LL、X = 0、F = 1チャー CH = GETCHAR()。
    一方、(CH < ' 0 ' || CH> ' 9 '){ 場合(CH == ' - ')、F = - 1; CH = GETCHAR()。}
     一方、(CH> = ' 0 ' && CH <= ' 9 '){X =(X << 1)+(X << 3)+(CH ^ 48)。CH = GETCHAR()。}
     戻りのx *のF。
} 
のconst  int型 N = 2E5 + 7 int型N、[N]、ANS、G [N]、Q [N]。
LL和[N]、F [N]。
// [I] =和[J-1] -sum [I-1] J F> iが[J-1] -sum [I-1]>をf [J] =合計
 // 和を[I-1] <=和[J-1] -f [J]
 // K> jの和[K-1] -f [K]>和[J-1] -f [J] 
INT メイン()
{ 
    N =読む();
    以下のためにint型 I = 1 [I] = iが++; iが<= N) )(読み取ります。
    以下のためにint型私= 1 ; iが<= N; I ++)は和[I] =和[I- 1 ] + [I]。
    INTは L = 1、R = 1Q [ 1 ] = N + 1 以下のためにint型 I = N; I; i-- 
    { 
        一方(L <R &&和[Q [L + 1 ] - 1 ] -sum [I- 1 ]> = F [Q [L + 1 ]])L ++。// 队列中越后面的位置越优 
        F [I] =和[Q [L] - 1] -sum [I- 1 ]。G [I] = G [Q [L] + 1 一方(L <= R &&和[Q [R] - 1 ] -f [Q [R] <=和[I- 1 ] -f [I])r--の
        Q [ ++ R] = I。
    } 
    のprintf(" %d個の\ n "、G [ 1 ])。
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/LLTYYC/p/11331369.html