Help Jimmy(動態規劃)

點擊打開鏈接


Help Jimmy
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 12168   Accepted: 4021

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

1
3 8 17 20
0 10 8
0 10 13
4 14 3

Sample Output

23

Source









1
#include<stdio.h>
2
#include<string.h>
3
#include<math.h>
4
#include<map>
5
#include<set>
6
#include<queue>
7
#include<iostream>
8
#include<algorithm>
9
using namespace std;
10
#define maxn 1111
11
#define inf 99999999
12
int dp[maxn][2];
13
int n,x,y,lmax;
14
struct node{
15
    int l,r;
16
    int h;
17
}a[maxn];
18
bool cmp(node a,node b){
19
    return a.h<b.h;
20
}
21
void leftime(int x){
22
    int k=x-1;
23
    while(k>=0&&a[x].h-a[k].h<=lmax){
24
        if(k==0){
25
            dp[x][0]=a[x].h;
26
        }
27
        if(k>0&&a[x].l>=a[k].l&&a[x].l<=a[k].r){
28
            dp[x][0]=a[x].h-a[k].h+min(dp[k][0]+a[x].l-a[k].l,dp[k][1]+a[k].r-a[x].l);
29
            return ;
30
        }
31
        else k--;
32
    }
33
    if(a[x].h-a[k].h>lmax) dp[x][0]=inf;
34
}
35
void rightime(int x){
36
    int k=x-1;
37
    while(k>=0&&a[x].h-a[k].h<=lmax){
38
        if(k==0){
39
            dp[x][1]=a[x].h;
40
        }
41
        if(k>0&&a[x].r>=a[k].l&&a[x].r<=a[k].r){
42
            dp[x][1]=a[x].h-a[k].h+min(dp[k][1]+a[k].r-a[x].r,dp[k][0]+a[x].r-a[k].l);
43
            return ;
44
        }
45
        else k--;
46
    }
47
    if(a[x].h-a[k].h>lmax) dp[x][1]=inf;
48
}
49
int getans(){
50
    for(int i=1;i<=n+1;i++){
51
        rightime(i);
52
        leftime(i);
53
    }
54
    return min(dp[n+1][0],dp[n+1][1]);
55
}
56
int main(){
57
    int T;
58
    scanf("%d",&T);
59
    while(T--){
60
        scanf("%d%d%d%d",&n,&x,&y,&lmax);
61
        for(int i=1;i<=n;i++){
62
            scanf("%d%d%d",&a[i].l,&a[i].r,&a[i].h);
63
        }
64
        a[0].l=x; a[0].r=x; a[0].h=y;
65
        a[n+1].l=-20000; a[n+1].r=20000; a[n+1].h=0;
66
        sort(a,a+n+2,cmp);
67
        int ans=getans();
68
        printf("%d\n",ans);
69
    }
70
}
















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章