zoukankan      html  css  js  c++  java
  • Help Jimmy 递推动规

                                                                                                       Help Jimmy

    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
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    #define limit 1010
    #define INF 2000000
    struct plat{
        int lx, rx, h;
    };
    struct plat a[limit];
    int leftdp[limit], rightdp[limit];
    int t, n, x, y, Max;
    int cmp(const void *p1, const void *p2){
        return (*(plat *)p2).h > (*(plat *)p1).h ? 1 : -1;
    }
    int mindp(int p, bool flag){
        int yy = a[p].h, i, xx;
        if(flag)  xx = a[p].lx;
        else  xx = a[p].rx;
        for(i=p+1; p<=n; i++)
            if(a[i].lx <= xx && a[i].rx >= xx)
                break;
        if(i <= n) {
            if(yy - a[i].h > Max)
                return INF;
        }
        else {
            if(yy > Max)
                return INF;
            else
                return yy;
        }
        int nleft = yy- a[i].h + xx - a[i].lx;
        int nright = yy - a[i].h + a[i].rx - xx;
        if(leftdp[i] == -1)
            leftdp[i] = mindp(i, true);
        if(rightdp[i] == -1)
            rightdp[i] = mindp(i, false);
        nleft += leftdp[i];
        nright += rightdp[i];
        if(nleft < nright)
            return nleft;
        return nright;
    }
    int main(){
        int t;
        scanf("%d", &t);
        while(t--){
            scanf("%d%d%d%d", &n, &x, &y, &Max);
            a[0].rx = x;
            a[0].lx = x;
            a[0].h = y;
            memset(leftdp, -1, sizeof(leftdp));
            memset(rightdp, -1, sizeof(rightdp));
            for(int i=1; i<=n; i++)
                scanf("%d%d%d", &a[i].lx, &a[i].rx, &a[i].h);
            qsort(a, n+1, sizeof(plat), cmp);
            printf("%d
    ", mindp(0, true));
        }
        return 0;
    }


  • 相关阅读:
    使用 Spring data redis 结合 Spring cache 缓存数据配置
    Spring Web Flow 笔记
    Linux 定时实行一次任务命令
    css js 优化工具
    arch Failed to load module "intel"
    go 冒泡排序
    go (break goto continue)
    VirtualBox,Kernel driver not installed (rc=-1908)
    go运算符
    go iota
  • 原文地址:https://www.cnblogs.com/Genesis2018/p/9079880.html
Copyright © 2011-2022 走看看