zoukankan      html  css  js  c++  java
  • POJ 1661 Help Jimmy

    POJ 1661 Help Jimmy

    题面是中文,不在赘述。

    一道DP题,dp[i][j]表示第i个平台上从左(dp[i][0])右(dp[i][1])下降到地面的最短时间。

    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    #define inf 0x3f3f3f3f3f
    struct node
    {
        int x,y;
        int h;
    };
    node a[1010];
    int dp[1010][2];
    int n,X,Y,H;
    bool cmp(node aa,node bb)
    {
        if(aa.h==bb.h)
            return aa.x<bb.x;
        else
            return aa.h<bb.h;
    }
    void lefttime(int t)
    {
        int k=t-1;
        //判断平台位置并且两个平台之间的高度差不大于H。
        while(k>0 && a[t].h-a[k].h<=H)
        {
            if(a[t].x>=a[k].x && a[t].x<=a[k].y)
            {
                dp[t][0]=a[t].h-a[k].h+min(dp[k][0]+a[t].x-a[k].x, dp[k][1]+a[k].y-a[t].x);
                return;
            }
            else
                k--;
        }
        if(a[t].h-a[k].h>H)
            dp[t][0]=inf;
        //当平台是最低的那个时,直接是它到地面的高度
        else
            dp[t][0]=a[t].h;
    }
    void righttime(int t)
    {
        int k=t-1;
        //判断平台位置并且两个平台之间的高度差不大于H。
        while(k>0 && a[t].h-a[k].h<=H)
        {
            if(a[t].y>=a[k].x && a[t].y<=a[k].y)
            {
                dp[t][1]=a[t].h-a[k].h+min(dp[k][0]+a[t].y-a[k].x,dp[k][1]+a[k].y-a[t].y);
                return;
            }
            else k--;
        }
        if(a[t].h-a[k].h>H)
            dp[t][1]=inf;
        //当平台是最低的那个时,直接是它到地面的高度
        else
            dp[t][1]=a[t].h;
    }
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d%d%d",&n,&X,&Y,&H);
            for(int i=1; i<=n; i++)
                scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].h);
            a[n+1].x=X;
            a[n+1].y=X;
            a[n+1].h=Y;
            a[0].x=-200000;
            a[0].y=200000;
            a[0].h=0;
            sort(a,a+n+2,cmp);
            for(int i=1; i<=n+1; i++)
            {
                lefttime(i);
                //printf("%d ",dp[i][0]);
                righttime(i);
                //printf("%d
    ",dp[i][1]);
            }
            printf("%d
    ",min(dp[n+1][1],dp[n+1][0]));
        }
        return 0;
    }
  • 相关阅读:
    发起qq临时会话
    easyUI-textbox回车获取不到正确的textbox值问题
    Linq in条件查询
    常用js-API
    MVC4不支持EF6解决方案 && Nuget控制台操作说明
    JS报表打印分页CSS
    关于phpinfo页面展开的渗透
    基于phpmyadmin的攻击
    upload_labs靶场
    文件上传漏洞
  • 原文地址:https://www.cnblogs.com/zzulipomelo/p/5001826.html
Copyright © 2011-2022 走看看