zoukankan      html  css  js  c++  java
  • POJ1661

    题意
    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到底地面时可能的最早时间。
    分析
    错误分析:一开始想从高到底分析为题,发现好多问题难以处理,然后就咸鱼
    正解:从低到高纪录每个板子到地面的最短时间,首先将所有板子按照高度排序,转移的时候注意一个板子左右只能到达一个板子
    定义:dp[i][2]:分别纪录第i个板子左右到达地面得最短时间
    转移:低到高转移,左右两边只能转移一次即可
    #include<iostream>
    #include<string>
    #include<cmath>
    #include<algorithm>
    #include<vector>
    #include<cstdio>
    using namespace std;
    
    const int maxn = 1000+10;
    struct node
    {
        int x,y,h;
        friend bool operator < (node a, node b)
        {
            return a.h<b.h;
        }
    }a[maxn];
    int sx,sy,n,mmax;
    int dp[maxn][3];
    
    
    int main()
    {
        int t;
        scanf("%d", &t);
        while(t--)
        {
            scanf("%d%d%d%d", &n, &sx, &sy, &mmax);
            for(int i=1;i<=n;i++)
            {
                scanf("%d%d%d", &a[i].x, &a[i].y, &a[i].h);
                dp[i][0]=dp[i][1]=1e9;
            }
            dp[n+1][0]=dp[n+1][1]=1e9;
            sort(a+1,a+n+1);
            a[n+1].x=sx, a[n+1].y=sx, a[n+1].h=sy;
            a[0].x=-3000;
            a[0].y=3000;
            a[0].h=0;
            for(int i=1;i<=n+1;i++)
            {
                bool zuo=true, you=true;
                for(int j=i-1;j>=0;j--)
                {
                    if(a[i].h-a[j].h>mmax)
                        break;
                    if((!zuo) && (!you))
                        break;
                    if(zuo)
                    {
                        if(j==0)
                        {
                             dp[i][0]=a[i].h;
                             zuo=false;
                        }
                        else
                        {
    
                        if(a[i].h-a[j].h<=mmax)
                        {
                            if(a[j].x<=a[i].x && a[j].y>=a[i].x)
                            {
                                dp[i][0]=a[i].h-a[j].h+min(dp[j][0]+a[i].x-a[j].x, dp[j][1]+a[j].y-a[i].x);
                                zuo=false;
                            }
                        }}
                    }
                    if(you)
                    {
                        if(j==0)
                        {
                            dp[i][1]=a[i].h;
                            you=false;
                        }
                         else
                        {
                        if(a[i].h-a[j].h<=mmax)
                        {
                            if(a[j].x<=a[i].y && a[j].y>=a[i].y)
                            {
                                dp[i][1]=a[i].h-a[j].h+min(dp[j][0]+a[i].y-a[j].x,dp[j][1]+a[j].y-a[i].y);
                                you=false;
                            }
                        }}
                    }
                }
            }
            printf("%d
    ", dp[n+1][0]);
        }
    }
    View Code
    要么优秀要么生锈
  • 相关阅读:
    Python 学习笔记 -- 列表的基本使用
    帮助你构建云服务的开源平台:openstack
    一个基于Asterisk构建的VOIP应用软件:Elastix介绍
    Asterisk项目概述
    Asterisk 代码架构概述
    云计算投入成本分析
    撕去服务器虚拟化和云计算的神秘面纱
    VOIP开源项目源码地址
    websocket技术
    JSP页面静态化总结之一使用URLRewrite实现url地址伪静态化
  • 原文地址:https://www.cnblogs.com/Superwalker/p/7978175.html
Copyright © 2011-2022 走看看