タイトル説明
カルメン-から大切ファーマージョンHolsteins
牛-で「うまくジャンク」に陥っています。"まあゴミは"その深さ、地元の農家のごみ処分であるD(2 \ルD \ル100)D (2 ≤ D ≤ 1 0 0 )足。
カルメンは、同じウェルの高積まれるまで待って、彼女は井戸から逃げることができるようになり、ガベージアップしたいです。また、カルメンは、ジャンクを食べることによって自分たちの生活を維持することができます。
それぞれが食べることを拒否するために使用されるか、または積層して過ごす時間カルメンずにゴミを積み上げることができます。
カルメンが知っていると仮定し、事前に各時間ごみは廃棄Tを(0 <T \ル1000)T (0 < T ≤ 。1 0 0 0 )、及びそれぞれのダンプの高さ(1 \ルH \ル25 H H (1 ≤ H ≤ 2 5)およびごみに食べるが、ライフタイム維持することができるF(1 \ルF \ル30)、F (1 ≤ F ≤ 3 0 )、ウェルから脱出するカルメン最も早い時間を要します現在の身体が十分な期間カルメン持っていたと10 。1 、エネルギーの0時間、カルメン場合10 。1 0時間以内に食べていないが、カルメンが餓死します。
入力形式
最初のライン2 二つの整数、D D、及び Gは、(ルG \ル100 \ 1)G (1 ≤ G ≤ 。1 0 0 )、G Gは、十分に置かれている廃棄物の量です。
第二にG. 1 + G + 。成る1行毎。3 :三つの整数T(0 <T <= 1000)、T (0 < T < =を1 0 0 0 )、廃棄物が十分に投入された時刻を表します。(1 \ルF. \ル30)F. F. (1 ≤ F. ≤ 3 0 )は、ガベージ時間カルメンの寿命を維持することができることを示し、及び H(1 \ルH \ル25)H (1 ≤ H ≤ 2 5。 )ごみは、高さを上げることができます。
出力フォーマット
カルメンはトラップから登ることができた場合は、全体の出力は、時に最も早く登るアウトを示し、それ以外の場合は出力カルメンは最長のロングを生き残ることができます。
サンプル入力と出力
4 20 5 4 9 9 3 2 12 6 10 13 1 1
13
説明/ヒント
[サンプル記述]
カルメンは、彼女は最初のガベージ受信積み重ね:高さを9 = H E I G H Tの= 9;。
カルメンは、彼女が最初に受信食べる2 から2ごみ、彼女の人生の10 1。0時間を延ばす13である1。3時間。
積層のカルメン3。3ごみ、高さ= 19。H E I G H Tが= 1。9。
積層のカルメン。4 4ごみ、高さ= 20であるH E I G H T = 2 0。
この問題は非常に似ている01 0 ので、1ナップザックが、違いがある01 0 の状態が変更を加えるためには、「インストールしない」の1つのナップサックはありませんが、インストールしないでくださいここにゴミを吸い上げます。
DP [I] [J] D P [ I ] [ J ]にスローに記憶されたI Iは、高さ、拒否J J寿命の最大値。場合DP [I] [j]が0 = D P [ I ] [ J ] = 0、牛実は人生の値が正確であるとき、つまり、瀕死状態、0 ゴミ箱牛の0、(この質問は一日中、ここで立ち往生していました...)。したがって、初期化するときDP D P配列が負の値[割り当てることがヒントのmemset T I Pを:m個のE M S E 正の数tは、ここでは、実際にその番号に割り当てられている機能が、値の大多数ではありません1と0は効果がありません]
初期化するには覚えている:に投げられたとき0 0ごみ、高さ0 0、生活の牛の値が10 1 0
同様に、ごみの配列をソートするために、私はオーバーロード演算子を使用して(そこにごみに投げ込まれてもよいが、一方では特別な文が存在しないことに注意してください(おそらく水データ)もし場合、すなわち、加重値を追加することができAT BT == A 。T = = B 。Tは、比較は、それらの継続HのH、すなわち、高さが食べるまで上昇させることができます)
別の:時間によって消費されるエネルギーの各ピースR&LT .tr [I] .T [I + 1] R&LT [ Iは+ 1 ] 。T - R&LT [ I ] 。T
コードの説明:場合はバックパックのサイクル、DP [I] [J] <0 D P [ I ] [ J ] < 0、この死んだ牛に示す状態はスキップ、存在していたかではありません。場合DPは、[I] [J] == 0 D P [ I ] [ J ] = = 0、この状態は、他の牛からの状態遷移によって記述されているが、瀕死状態、また一度だけ返信動作することができます短い時間の次の期間の長さよりもエネルギー、及びステップから飛び出すことができないが、現在の状態が出て転送することができない、牛が死亡しました。状態遷移場合DP D P値もより大きい0 (ごみは、現在のアレイ順序付けされているので)通常、0 :Tip2 T I P 2 :それは遷移条件寿命でなければならないGEの\ 長さ(ここでは、時間の期間は≥れますそれは)少しピット
あなたはバックパック内のループの外にジャンプすることができない場合、すなわち、トリガしないリターン0; R&LT E T U R&LT N- 0 ;説明牛が飛び出す、再度シミュレーションSUMはS Uがあれば、蓄積されたエネルギーが使用されたm個のm個のM(エネルギー)十分(また、本明細書公報判定)をジャンプする、牛の残りは(ウェル悲しみ)に添加したSUM S Uと一緒にM個の出力。
書式#include <cstdioを>
する#include <CStringの>
の#include <アルゴリズム>
std名前空間を使用しました。
int型の最大値(INT X、int型のY){X> Yを返すX:Y;}
int型DP [101] [1001]; // DP [I] [J]表示在扔进去第I个辣鸡、在J的高度时的最大生命
構造体ゴミ
{
int型のT、F、H。
フレンドブール演算子<(ゴミA、ごみB)
{
<におけるリターンBT。
}
} R [101]。
INTメイン()
{
memsetの(DP、-1、はsizeof(DP))。
int型のD、G。
scanf関数( "%dの%のD"、&D、およびG)。
以下のための(iは1 = int型; I <= G、I ++)は
scanf関数( "%D%D%D"、およびR [i]を.T、およびR [i]は.F、&R [I]・H)。
ソート(R + 1、R + G + 1)。
DP [0] [0] = 10。
R [0] .F = 0。
R [0]・H = 0。
R [0] .T = 0。
(I 0 = int型のために、I <G。
{
IF(DP [I]、[J] <状態0)//なし牛は
、続行しない
= D && DP [I]、[J]> = R&LT IF(J + R&LT・H [I + 1]> [I + 1]とき.tr [i]が.T)//次の唯一のゴミを満たすために、この状態を転送するには直接出てジャンプすることができますが、また次のゴミまで出て保持するために牛のエネルギーを満たすために。
{
のprintf( "%d個の\ N-"は、R [I + 1] .T);
0を返す;
}
[I + 1](DP [I] [J] -R&LT IF R&LT .T + [I] .T> 0 =)
DP [I + 1] [R&LT J +は[I + 1] .H。] DP = [I] [J]が-R&LT [I + 1] R&LT .T + [I] .T;
IF(DP [私は+ -R&LTの[I] [J]。1] R&LT .T + [I] .T> = 0)
+ I DP [1 + I] [J] = MAX(DP [1]〜[J]、DP [I ] [J] -r [I + 1] .T + R [i]は.T + R [I + 1] .F); // DPとして本明細書に最大[I + 1] [j ] の値が可能であったであろう
}
//現在の状態ならば、そのことを示すことは飛び出しませんでした
もう一度再シミュレーション食べフル//
今、エネルギーが不足し、接着していないとき@牛を
int型メートル= 10、合計= 0 ; // mは今ありますエネルギーは、エネルギーが既に使用されてきた和
<;(= G Iが++ Iがint I = 1)のために
{
IF(R&LT [I] .tr [-I 1] .T M)>
{
のprintf(「%d個の\ N-」、SUM + m)は、
0を返します。
和+ = R [i]は.tr [I-1] .T。
M- = R [i]は.tr [I-1] .T。
M + = R [i]は.F。
}
のprintf( "%d個の\ n"、和+ M)。
0を返します。
}