ヘイのUSACO 2009オープン乾草タワータワー(+モノトーンキュー貪欲最適化DP)

https://ac.nowcoder.com/acm/contest/1072/B

 

 

説明

ランプの明るさを調整するために、スタック干し草俵Besseyカラムを使用し、その後、牛を交換電球の上部に登ります。干し草の俵がコンベヤベルトから搬送する、干し草のNパッケージ、iはウィスコンシンパケットの乾草幅の合計、均一な長さの高さが存在することになります。ヘイ塔は、店に一から構築されました。ベーチェットは、第一の層として地面に重ね干し草送信される最初のパケットの数を選択し、すぐにいくつかの塊馬鹿第二層、第三層構造......孔に送信して処理を繰り返します全てれるまで、干し草を使い果たします。干し草のベールのそれぞれは、互いに近接して隙間が生じず、建物を安定化させるために、上部干し草の幅が、下層の幅を超えません。干し草の順に出荷俵は干し草の数俵なしに放棄することができない、過ごすために持っている必要があります。ベッシーの目標は最も高いタワーを構築することです、あなたが彼女には、タスクバーを完了するのに役立ちます。

入力形式

最初のライン:単一の整数:N、1≤N個の第2行へ100000行≤N + 1:I + 1番目のライン整数WI、1≤のWi≤10000を有します

出力フォーマット

最初のライン:確立することができる最大の高さを表す単一の整数

サンプル入力

3 
1 
2 
3

サンプル出力

 2

ヒント

第一層、第二層3上に図1および図2

底部に、すなわち、最初の2つ(1および2の幅)は、第二層3の幅の代わりに3の全体の幅、。

       + ---------- + 

       |    3      | 

       + --- + ------ + 

       | 1 |   2   | 

       + --- + ------ +

 

 

問題の解決策

From:解釈レポート

この質問は、最初に貪欲なのだと思いますが、すぐに却下すべきです。あなたは完全に欲を放棄した場合でも、この時間は、その後、あなたはそれが正の解であると思うかもしれません。

これによって明らかな問題のステージには、移動規制との間で締結することができます。データの範囲を考慮せずに、それはよく行われる必要があります。しかし、N≤100000は、唯一のより良いアルゴリズムを求めることができます。

一見素晴らしい感覚が正しいと考えると、当然の結果を証明する方法がわからない、その後、考える貪欲リターン:

タワーは最高の、最も薄くなければならないことにするために、グラフィックス領域として見なければなりません。

実際には、これは正しいです。ダニエルは張Kunweiを引用し証明しました

プログラムを最大限に活用するために層の数のいずれかを削除、CA層は、各層の最大ブロック数に下から上へと表さアイである、提供される;最短ベースプログラムを取ることも、CB層が設けられており、前記バイと呼ばれる最大ブロック数まで底から各層。明らかA1> = B1、ACB <= BCBは、kの少なくとも一部(1、CB)の存在を示す、AK-1> = BK-1及びAK <= Bkのを満たします。すなわち、最初のKスキームAスキームB、第一の層が完全に層がKを含むされます ダウン新しいプログラム、プログラムAによる第一層Kまで、プログラムBプレスを構築し、双方は、ブロックK第一層の中央を入れないでください。層の同じ数、同じ長さB塩基と新しいプログラム。QED。

少し説明を追加します。

そこA、別の「高低」のような2つのタワーの最大高さは、それぞれの層の幅だけ小さく、注文を受けている(Aよりも高さBより小さい)Bに設定されている
まず、明らかにHがあるB ≤hは底部の幅よりも小さく、A及びB HのでB ≦時間aが、それは確かにA層であるが全体的な状況のBよりもさらにいくつかのAない限り不可能である幅よりも幅B(Bよりも小さいですビルディングブロック)、B比でちょうどこの時点で、マルチ1が存在しなければならないので、Aに、その上に多層のほんの一部よりもBを入れて、より明確に細かくなり、高さと同じ

だから、長い「最小列幅」よりも高いがあるので、あなたは上記の交換作業に従うことができ、最終的にあなたが見つけるだろう、最高の「最小幅塔」ということです

(何を、読み取ることができない?..私はそれを介して取得したいときに読むためにあなたの忍耐を取る、そして、あまりにも)

だから[i]は、G N-iはfで干し草を積層することができる最大の高さを表現することができる[I ] 底の最小幅を示しています。
F [I] = F [J ] + 1、G [I] = W [J-1、I(J> = I、W [J-1、i]は> = G [J])

最小を取得しようとしますJ

しかし、直接暴力の複雑さの転送の時間である場合、O N- 2 最適化されるにはあまりにも明らかではないが、このデータ範囲に適していません。

J [合計 - - 1私たちは、ステージで私は、あなたをkよりもK> J> I、Jのため、意思決定が唯一のk J kは条件を満たすように条件を満たしていないことができ、式を終えするF [j]があることがわかりました]> F [k]は-sum [K - 1]

キューに格納されたJ、ヘッド素子場合:したがって、転送キューのモノトーンを最適化するために使用することができる満足遷移条件の下で見ることができる観察伝達方程式、より大きなj個のF [I]、G [i]がより好ましく、次の出会いは、転送条件は、チームが最初に削除する条件を満たすために最後の夜チームを入れて持っているよりも、チームにチームであれば最後の要素たびにチームを蹴るチームが直接転送で転送ヘッド取るように置きます。

だから、最短プログラムの下縁部、最も高い上昇。いくつかの構成列挙、式を導出することができるその底:nの底部からiがF [I] =最小幅(和[J-1 ... i])とFを満たす[J] <=和[J-1 ... I](これは上位階層の幅は、次の層の幅よりも大きくないになるだろうからである)、そしてn> = J> I

I = N> 1

分析、[I] =分(和[J-1])ここで、f見出さ - SUM [i]が有するIが増加されながら、和[I-1](注文SUM [i]のプレフィックスと幅を示します)増加し、iはn個プット[i]はfを更新取り出される予選決定J、かつてからそう。しかし、これはまだ、すべてのデータを渡しません。

すべての決定を発見再び解析は、(例えば、Jの判定値が合計である[J-1])一方の単調減少前方N、すなわち、好ましい比です。したがって、決定的な要因を有効にするには、自分の時間です。

決定jについて:[J] F不等式<=和を観察[J-1 ... I]即ちF [J] <= [J-1] -sum [I-1]、変形が得られる和和[1- 1 <=和[J-1] -f [j]は、和を見つける[J-1] -f [j]はその有効時間であり、それは最初のiよう和である[I-1] <後=和[J-1] -f [J] J 1に対して有効な決定です。逓減の有効時間、そしてチームのヘッドと効果にチームのヘッドは常に+1有効にならないように、だから我々は、単調なキューを開くことができます。チームの意思決定の後、以前の優れたよりもいるので、そのチームに一度力に頭+1、チームが爆弾をオフに向かうことができます。チームは、尾の終わりの有効時間の有効時間あれば-1 <フォースは、発射体の尾の後ろにいたとき-1。

これは、この問題への完璧なソリューションを持っているでしょう、複雑さはO(n)があります

 

1つの#include <cstdioを>
 2  のconst  int型 N = 100000 + 9 3  int型Q [N]、G [N]、F [N]、合計[N]、[N、W、N。
4  INT メイン()
 5  {
 6      のscanf(" %d個"、&N)
7      ためにはint型 i = 1 ; iが<= N; ++ i)が{
 8          のscanf(" %dの" + W、I)。
9          和[I] =和[I- 1 ] + [I] W。
10      }
 11     Q [ 1 ] = N + 1 12      INT H = 1、T = 1 13      のためには、int型 I = N; I; - I){
 14          ながら(H <T && F [Q [H + 1 ] <=和[Q [H + 1 ] - 1 ] -sum [I- 1 ]) ++ H。
15          F [I] =和[Q [H] - 1 ] -sum [I- 1 ]。
16          G [I] = G [Q [H] + 1 17          Q [++ T] = I。
18          一方((T> H)&&(F [Q [T- 1 ] -和[Q [T-1 ] - 1 ] +和[Q [T] - 1 ]> F [Q [T]))
 19              --t、Q [T] = Q [T + 1 ]。
20      }
 21      のprintf(" %d個の\ n "、G [ 1 ])。
22 }

 

 

おすすめ

転載: www.cnblogs.com/jiamian/p/11355603.html