題目
「help jimmy」 是在下圖所示的場景上完成的遊戲。
場景中包括多個長度和高度各不相同的平台。地面是最低的平台,高度為零,長度無限。
jimmy老鼠在時刻0從高於所有平台的某處開始下落,它的下落速度始終為1公尺/秒。當jimmy落到某個平台上時,遊戲者選擇讓它向左還是向右跑,它跑動的速度也是1公尺/秒。當jimmy跑到平台的邊緣時,開始繼續下落。jimmy每次下落的高度不能超過max公尺,不然就會摔死,遊戲也會結束。
設計乙個程式,計算jimmy到底地面時可能的最早時間。
輸入
第一行是測試資料的組數t(0 <= t <= 20)。每組測試資料的第一行是四個整數n,x,y,max,用空格分隔。n是平台的數目(不包括地面),x和y是jimmy開始下落的位置的橫豎座標,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)。所有座標的單位都是公尺。
jimmy的大小和平台的厚度均忽略不計。如果jimmy恰好落在某個平台的邊緣,被視為落在平台上。所有的平台均不重疊或相連。測試資料保證問題一定有解。
輸出
對輸入的每組測試資料,輸出乙個整數,jimmy到底地面時可能的最早時間。
樣例輸入
138
1720010
801013414
3
樣例輸出
23
思路這道題一開始的時候其實我沒太看懂輸入,有點繞。
輸入第一行的n,x,y,h分別對應有幾個台階,你當前處於的x位置,你當前處於的高度和你每次往下跳不能超過的高度。
首先我們在儲存完所有的台階之後,我們把自己所處的台階(比較特別,x1=x2=x)和地面(也是比較特別,x1,x2都是無限大,h=0)也存在陣列中。
struct node
a[1100];
scanf
("%d%d%d%d"
,&n,
&x,&y,
&maxh)
;for
(int i=
1; i<=n; i++
)scanf
("%d%d%d"
,&a[i]
.x1,
&a[i]
.x2,
&a[i]
.h);
a[n+1]
.x1=x;
a[n+1]
.x2=x;
a[n+1]
.h=y;
//起點台階的資訊a[0
].x1=
-2e6;a[
0].x2=
2e6;a[0
].h=0;
//地面的資訊
然後我們將資訊按高度從低到高排個序:
bool
cmp(node b1,node b2)
sort
(a,a+n+
2,cmp)
;//一共有n+1個元素
接下來我們設計乙個陣列dp[1100][2]。
dp[i][0]的值為從第i層向左走到達地面的最短時間,dp[i][1]的值為從第i層向右走到達地面的最短時間。
接下來我們從第2層開始,算出每層向左走到達地面的最短時間和向右走的最短時間。
最後我們取dp[n+1][0]和dp[n+1][1]兩者中較小值就ok了(貪心)。
直接看**,伊莉莎白!
//求第m層向左走到地面的最少時間
else
k--;}
if(a[m]
.h-a[k]
.h>maxh)
//如果不可以直接跳到地面
dp[m][0
]=2e6;
else
//如果可以直接跳到地面
dp[m][0
]=a[m]
.h;//信仰之躍
}void
rightmin
(int m)
//求第m層向右走到地面的最少時間,一樣的過程
else
k--;}
if(a[m]
.h-a[k]
.h>maxh)
dp[m][1
]=2e6;
else
dp[m][1
]=a[m]
.h;}
intmain()
cout<<
min(dp[n+1]
[0],dp[n+1]
[1])
<
//最後貪一下(●'◡'●)
}}雖然只是藍橋國三,但還是很開心o( ̄▽ ̄)ブ
繼續努力,下次再見~
動態規劃 什麼是動態規劃?
先來看看 資訊學奧賽一本通第5版 是怎麼說的 動態規劃程式設計是對解最優化問題的一種途徑 一種方法,而不是一種特殊演算法。不像前面所述的那些搜尋或數值計算那樣,具有乙個標準的數學表示式和明確清晰的解題方法。動態規劃程式設計往往是針對一種最優化問題,由於各種問題的性質不同,確定最優解的條件也互不相同,...
mysql動態規劃 動態規劃
動態規劃 能夠動態規劃的問題具有以下特點 可分解成規模更小的子問題 子問題的結果可復用 關鍵是要理解狀態轉移方程的含義就好啦!數字三角形 問題描述 在數字三角形尋找從頂到底的路徑,使得路徑經過的數字之和最大。規定每一步只能往左下或右下走,求出最大路徑和。遞迴解法 include include us...
《動態規劃》 ACM 動態規劃例題詳解
描述 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 圖1 圖1給出了乙個數字三角形。從三角形的頂部到底部有很多條不同的路徑。對於每條路徑,把路徑上面的數加起來可以得到乙個和,你的任務就是找到最大的和。注意 路徑上的每一步只能從乙個數走到下一層上和它最近的左邊的那個數或者右邊的那個數。輸...