• 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;
    }
  • 相关阅读:
    创建型模式(四) 单例模式
    创建型模式(三) 原型模式
    创建型模式(二) 建造者模式
    创建型模式(一) 简单工厂模式、工厂模式与抽象工厂模式
    Django15-分页功能
    Django14-Ajax删除按钮动态效果
    网络day04-配置备份、清除、密码恢复、IOS更新
    网络day03-NTP配置和SMTP配置
    网络day02-设备配置远程登录
    HTML注释
  • 原文地址:https://www.cnblogs.com/zzulipomelo/p/5001826.html
Copyright © 2020-2023  润新知