ヘルプジミー
説明:
「ヘルプジミーは、」図に示した次のゲームシーンに行われます。
インターネットの異なる長さと高さの複数を含むシーン。地面は、ゼロの最小プラットフォーム高さ、無制限の長さです。
ジミーマウスは、すべてのプラットフォームよりもどこかに高いから時間0で落ちるようになった、それは常に1メートル/秒の速度を下降ます。ジミーは、プラットフォームになると、プレイヤーはそれを左または右に実行させることを選択し、それがスピードを実行していることは1メートル/秒です。ジミーはプラットフォームの端に行き、下がり続けるようになったとき。ジミーは、高さのすべてのドロップは、ゲームが終了し、そうでなければ、彼らの死に落ちる、MAXメートルを超えてはなりません。
地上できるだけ早い時期の終わりにジミーを計算するプログラムを設計します。
入力
最初の行は、テストデータTの組の数である(0 <= T <= 20)。各テストの最初の行は、4つの整数N、X、Y、MAX、スペースで区切られています。Nは、(接地を含まない)プラットフォームの数であり、X及びY座標は、水平、ジミー落下開始位置であり、MAXは落下の最大高さです。次のNラインは三つの整数、X1を含む、プラットフォームを説明[I]、X2 [ I] とH [i]は。H [i]は、プラットフォームの高さを表し、X1 [i]とX2 [i]を横軸周りのプラットフォームのエンドポイントを表します。1 <= N <= 1000、 -20000 <= X、X1 [i]は、X2 [I] <= 20000,0 <H [I] <Y <= 20000(i = 1..N)。全ての座標の単位はメートルです。
ジミー・プラットフォームの大きさと厚さは無視できます。ジミーはちょうどプラットフォームの端にある場合は、プラットフォーム上に落下するとみなされます。すべてのプラットフォームは、重複したり参加しません。テストデータは、問題が解けるでなければならないことを確実にします。
出力
地面の最後にテストデータ入力、出力、整数、ジミーの各セットは、最も早い時間であってもよいです。
サンプル入力
1
3 8 17 20
0 10 8
0 10 13
4 14 3
サンプル出力
23
トピックリンク:
https://vjudge.net/problem/POJ-1661
DPの動的プログラミング、下から見上げ、DP [I] [2] [i]が[0]最後に最短時間最も左のi番目のプラットフォームを表し、DP [i]は[1]右端最短プラットフォームの端に表します時間。
状態遷移式:DP [I] [1]〜[I] .ha [K]・H +分(DP [K] [0] + [I] .x2 - [K] .x1、DPを[= K] [1] + [K] .x2 - [I] .x2); //右
DP [I] [0] [i]は.haを= [K]・H +分(DP [K] [0] + [I] .x1、[K] .x1、DP [K] [1 ] + [K] .x2 - [I] .x1)。//左
ACコード
1の#include <iostreamの> 2の#include <cstdioを> 3の#include <fstreamの> 4の#include <アルゴリズム> 5の#include <cmath> 6の#include <両端キュー> 7の#include <ベクトル> 8の#include <キュー> 9#含む< ストリング > 10の#include <CStringの> 11の#include <地図> 12の#include <積層> 13の#include < 設定 > 14の#include <数値> 15 のconst int型 INF = 0x3f3f3f。// 無限大 16 使用して 名前空間STDを、 図17のtypedef ロング ロングLL; 18である INT T; 19 INT N、X、Y、MAXH; 20 // 0の最後に最小時間左端インターネットi番目の意味 21 @ 1はi番目のインターネット右端を表します最後に最小時間 22は、 INT DP [ 1010 ] [ 2 ]; 23である 構造体ノード 24 { 25 のint ; X1、X2、H 26である }; 27 BOOL CMP(ノード、ノードB)// H降順 28 { 29 リターン AH> BH。 30 } 31ノード[ 1010 ]。 32 ボイド LeftTime(INT I)// 左 33 { 34 のint、K = I + 1 。 35 一方(K <N + 1 && [I] .ha [K]・H <= MAXH) 36 { 37 であれば([I] .x1> = [K] .x1 && [I] .x1 <= [ ] .x2)ここで、k 38 { 39 DP [i]が[ 0 ] [i]は.ha [K]・H +分(DP [K] [= 0 ] + [I] .x1 - [k]を。 X1、DP [K] [ 1 ] + [K] .x2- [I] .x1)。 40 リターン、 41である } 42が ++ K ; 43である } 44が IF([I] .ha [K]・H> MAXH)// 次のプラットフォームに到達することができない 45 DP [I] [ 0 ] = INF; 46である 他// 直接着陸 47 DP [I] [ 0 ] = [I]・Hと、 48 49 リターン; 50 } 51れる 空隙 RightTimeは(INT I)// 右 52である { 53が INT K = I + 1 ; 54であり 、一方(K <N +1 && [i]は.ha [K]・H <= MAXH) 55 { 56 であれば([I] .x2> = [K] .x1 && [I] .x2 <= [K] .x2) 57 { 58 DP [i]が[ 1 ] [i]は.ha [K]・H +分(DP [K] [= 0 ] + [I] .x2 - [K] .x1、DP [k]を[ 1 ] + [K] .x2- [I] .x2)。 59 リターン; 60 61 } 62 K ++ 。 63 } 64 であれば([I] .ha [K]・H> MAXH)// 不能到达下一平台 65 DP [I] [ 1 ] = INF。 66 他// 直接床 67 DP [I] [ 1。 =] [I]・Hと、 68 69 リターン; 70 } 71であり 、INT (メイン) 72 { 73である CIN >> T; 74 ながら(T-- ) 75 { 76 のmemset (DP、0、はsizeof (DP)); 77 A [ 0 ] = .x1 - 20000、A [ 0 ] = .x2 20000、A [ 0 ]・H = 0 ; // 土 78 CIN >> N >> X >> Y >> MAXH。 79 [ 1 ] .x1 = X [ 1 ] .x2 = X [ 1 ]・H = Y。// 初始位置 80 のために(int型 I = 2 ; iが<= N + 1 ; I ++ ) 81 { 82 CIN >> [I] .x1 >> [I] .x2 >> [I]・H。 83 } 84 ソート(+ N + 2 、CMP)。 85 のために(int型 iは= N; I> = 0 ; i-- ) 86 { 87 LeftTime(I); // 左 88 RightTime(I); // 右 89 } 90 INT MINTIME =分(DP [ 0 ] [ 0 ]、DP [ 0 ] [ 1 ])。 91 coutの<< MINTIME << てendl; 92 } 93 リターン 0 。 94 }