description
"help jimmy" 是在下圖所示的場景上完成的遊戲。
場景中包括多個長度和高度各不相同的平台。地面是最低的平台,高度為零,長度無限。
jimmy老鼠在時刻0從高於所有平台的某處開始下落,它的下落速度始終為1公尺/秒。當jimmy落到某個平台上時,遊戲者選擇讓它向左還是向右跑,它跑動的速度也是1公尺/秒。當jimmy跑到平台的邊緣時,開始繼續下落。jimmy每次下落的高度不能超過max公尺,不然就會摔死,遊戲也會結束。
設計乙個程式,計算jimmy到底地面時可能的最早時間。
input
第一行是測試資料的組數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恰好落在某個平台的邊緣,被視為落在平台上。所有的平台均不重疊或相連。測試資料保證問題一定有解。
output
對輸入的每組測試資料,輸出乙個整數,jimmy到底地面時可能的最早時間。
sample input
1sample output3 8 17 20
0 10 8
0 10 13
4 14 3
23思路:
關鍵:運用遞迴的思想用動態規劃的陣列實現
方法:將輸入的資料按高度由高到底排序,然後從最高乙個向下遞迴,根據條件判斷做出相應的動作,利用陣列儲存相應的時間
實現考慮:
1.不妨認為jimmy開始的位置是乙個編號為0,長度為0的板子,那麼整個問題就是要求leftmintime(0)。
2. 輸入資料中,板子並沒有按高度排序,所以程式中一定要首先將板子排序。
3. leftmintime(k)和rightmintime(k)可以用同乙個過程來實現(用乙個布林變數來區分)此處程式
用的flag
#include #include #include using namespace std;
const long int inf = 1000000;
int ncases;//宣告乙個變數儲存一共幾組資料
int n;//平台的數目
int x;//開始下落點的橫座標
int y;//開始下落點的豎座標
int nmax;//一次下落的做大高度
//定義乙個結構體,儲存各板子的狀態:板子左右橫座標和y座標
struct platform
p[1010];
//定義兩個陣列分別儲存從左邊和右邊下落的最短時間
int leftmin[1010];
int rightmin[1010];
//快速排序過程中用到的比較函式
int compare(const void *e1, const void *e2)
//確定最短時間到達地面
int mintime(int l, int flag)//l表示哪一塊木板,flag表示哪一端,0表示左端,1表示右端
else
//從起點下面的一塊木板開始遍歷
for(i = l + 1; i <= n; ++i)
//對於起點下面有木板的情況
if(i <= n)
else //對於起點下面沒有木板的情況
//起點下面有木板且距離第一塊木板高度不超過max
ltime = y - p[i].h + x - p[i].lx;//從起點到i木板的左端的時間
rtime = y - p[i].h + p[i].rx - x;//從起點到i木板的右端的時間
//遞迴實現各木板到地的時間
if(leftmin[i] == -1)
leftmin[i] = mintime(i, 1);
if(rightmin[i] == -1)
rightmin[i] = mintime(i, 0);
ltime += leftmin[i];
rtime += rightmin[i];
if(ltime < rtime)//判斷左邊和右邊的時間
else
}int main()
//將各平台按高度由高到低排序
//qsort的原型 void qsort(void *base, int elem, int width, int(*fcmp)(const void *, const void *));
//2.陣列中排序元素數量
//3.各元素的占用空間大小
//4.指向函式的指標,確定排序的順序
qsort(p, n + 1, sizeof(struct platform), compare);
cout << mintime(0, 1) << endl;
}return 0;
}
poj1661 Help Jimmy dp動態規劃
help jimmy description help jimmy 是在下圖所示的場景上完成的遊戲。場景中包括多個長度和高度各不相同的平台。地面是最低的平台,高度為零,長度無限。jimmy老鼠在時刻0從高於所有平台的某處開始下落,它的下落速度始終為1公尺 秒。當jimmy落到某個平台上時,遊戲者選擇...
poj 1661 Help Jimmy 動態規劃
題意 給n個用左端點 右端點 高度標識的平台,問乙個下落速度,移動速度均為1的點下落到地面的最小時間,其中每次下落距離不能超過輸入值max.分析 動態規劃ldp i 表示從第i塊木板左邊下落到地面的最小時間,rdp i 表示從第i塊木板右邊下落到地面的最小時間。poj 1661 sep9 inclu...
poj 1661 Help Jimmy 動態規劃
poj 1661 help jimmy help jimmy time limit 1000ms memory limit 10000k total submissions 13143 accepted 4363 description help jimmy 是在下圖所示的場景上完成的遊戲。場景中包...