タイトル説明
朝のトレーニングは、以上の木ACMチーム集団ランチして、彼らはN 10の食堂の有名なラインに来ました。唯一の人物Dafanに2つのDafan窓、それぞれの瞬間があります。すべての人の味(食欲)異なるので、彼らは食べ物を食べたいが異なっているために、それはDafanにかかる時間は、ユニークで個性的です。また、食べるために一人一人が同じ速度ではありませんので、食べる時間が異なっていてもよいかかります。
木ACMチームの食事の計画はこれです:Dafanを並べるためにナンバーワンのウィンドウには、2つのチームに分かれ、すべての人々の最初の、そしてそれぞれ1で各チームの順序を調整した後、ナンバーワンのチームは、数2に数2位にランクウィンドウがDafanをラインアップします。誰もが夕食の誰もが6つのコレクションは午後の訓練の地下に教えられた行った直後に、食事の後すぐに食べ始めるキック。
今、最高のユニットの一つの要求に応じて、皆Dafan時間と夕食の時間を与えられ、スキームをキューイングすることは可能な限り早期に、食事のすべての時間になります。
時間0で10のカフェテリアに到達するために木のACMチームを想定し、他の学生(のみDafanマスター)を食べるために何の食堂はありません。誰もが、唯一のランクに分することができなければなりません。2つのウィンドウが互いに独立して並列に動作している、と誰もDafanウィンドウと時間は無関係ですので、食事の直後に遅延なしで、食べ始めました。
Nは今、最高出力の下にあるすべての食事のために必要な時間を自分の個人Dafan時間と夕食の時間を与えられました。
入力形式
整数Nの最初の行は、Nは、個々の合計を表します。
二つの整数愛、ゲイの以下のN行。今度はDafanタイムとディナータイムI人を表しています。
出力フォーマット
夕食の皆の後早い瞬間に代わって整数T、。
サンプル入力と出力
5 2 2 7 7 1 3 6 4 8 5
17
説明/ヒント
すべての入力データが200を超えない正の整数です。
分析:まず、遅く食べて、より多くの最初Dafan、欲が明らかに正確さを思いました。
夕食時系列における最初の行によります。そして、デザインの状態を考慮してください。
最大総時間の人の現在の数、時間ウィンドウ番号1、時間の第2号窓、;:メンテナンスが必要
F [I] [J] [k]は私の前に個体を表し、1で費やされたj個の時間を設定し、2最大時間時刻kを費やします。
(長い注文後のプレフィックスとストレージの配列Dafanを維持?次元削減を考えてみましょう!だから、K + J =合計[i]は、K =合計[i]を-j、成功の次元削減!)
Fの前に[i] [j]は、個々の花I jを1分、最大食に保存されています。
x∈([X] [N] F)ANS =分[和、0 [S]。
私個人のために、彼は第1または第2のウィンドウに行くことができ、かつ1または第2の元の最大時間ウィンドウに影響を与える可能性がある:状態遷移方程式を考えてみましょう
ランク1:.A時間、すなわち、i番目の個々の食事は時刻jの前に終了させることができる、J> =のS [i]が、その後数1への影響を考慮してください。
F [I] [J] =分([I] [J] F、MAX([I] .B)[I] .A [JS]、J + S [I-1] F);効果を続いて!
どちらの過去の最長時間は、I-1は、個人の生産や私が影響を持っている人!
ランク2:
いずれの場合のために、F [i]は[J] =分(F [I] [J]、MAX(F [I-1] [j]を、和[I] -j + S [i]は.B))。 (2既知超える場合、更新、ウィンドウの影響を考慮して)
ACコード:
#include <ビット/ STDC ++ H>
名前空間STDを使用して、
CONST int型N = 210。
INT F [N] [N * N]。
構造体ノード
{
int型、B。
ブール演算子<(ノードZ)のconst
{
戻りB> ZB。
}
} S [N]。
INT和[N]。
メインINT()
{
int型のn;
scanf関数( "%のD"、&N);
(I 1 = int型、iが<= N; iが++)のため
のscanf( "%D%dの"、&S [i]は.A、&S [i]は.B)。
ソート(S + 1、S + 1個の+ N)。
以下のために(INT i = 1; iが<= N; iは++)
和を[I] =和[I-1] + S [i]の.A。
memsetの(F、127、はsizeof(F))。
F [0] [0] = 0。
以下のために(INT i = 1; iが<= N; iは++)
{
ため(INT J = 0であり、j <=和[I]; J ++)
{
IF(J> = sの[I] .A)[I] [J] =分([I] [J] F、MAX(F [I-1] [JS [I] .A、J + S F [I] .B))。
F [I] [J] =分(F [I] [J]、MAX(F [I-1] [j]を、和[I] -j + S [i]は.B))。
}
}
int型ANS = 2147483647。
以下のために(INT i = 0; iが<=合計[N]; I ++)は
ANS =分(ANS、F [n]は[I])。
printf( "%d個の\ n"、ANS)。
0を返します。
}