zoukankan      html  css  js  c++  java
  • 【POJ

    Help Jimmy


    Descriptions:

    "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

    题目链接:

    https://vjudge.net/problem/POJ-1661

     

    动态规划,从下往上找,dp[i][2]中dp[i][0]表示第i个平台最左边到底的最短时间,dp[i][1]表示平台最右边到底的最短时间。

    状态转移方程:dp[i][1]=a[i].h-a[k].h+min(dp[k][0]+a[i].x2-a[k].x1,dp[k][1]+a[k].x2-a[i].x2);//右

           dp[i][0]=a[i].h-a[k].h+min(dp[k][0]+a[i].x1-a[k].x1,dp[k][1]+a[k].x2-a[i].x1);   //左

     AC代码

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <fstream>
     4 #include <algorithm>
     5 #include <cmath>
     6 #include <deque>
     7 #include <vector>
     8 #include <queue>
     9 #include <string>
    10 #include <cstring>
    11 #include <map>
    12 #include <stack>
    13 #include <set>
    14 #include <numeric>
    15 const int INF=0x3f3f3f;//无穷大
    16 using namespace std;
    17 typedef long long ll;
    18 int T;
    19 int N,X,Y,MAXH;
    20 //0表示第i个平台最左边到底的最短时间
    21 //1表示第i个平台最右边到底的最短时间
    22 int dp[1010][2];
    23 struct node
    24 {
    25     int x1,x2,h;
    26 };
    27 bool cmp(node a,node b)//根据h从大到小排列
    28 {
    29     return a.h>b.h;
    30 }
    31 node a[1010];
    32 void LeftTime(int i)//
    33 {
    34     int k=i+1;
    35     while(k<N+1&&a[i].h-a[k].h<=MAXH)
    36     {
    37         if(a[i].x1>=a[k].x1&&a[i].x1<=a[k].x2)
    38         {
    39             dp[i][0]=a[i].h-a[k].h+min(dp[k][0]+a[i].x1-a[k].x1,dp[k][1]+a[k].x2-a[i].x1);
    40             return;
    41         }
    42         k++;
    43     }
    44    if(a[i].h-a[k].h>MAXH)//不能到达下一平台
    45         dp[i][0]=INF;
    46     else//直接落地
    47         dp[i][0]=a[i].h;
    48 
    49     return;
    50 }
    51 void RightTime(int i)//
    52 {
    53     int k=i+1;
    54     while(k<N+1&&a[i].h-a[k].h<=MAXH)
    55     {
    56         if(a[i].x2>=a[k].x1&&a[i].x2<=a[k].x2)
    57         {
    58              dp[i][1]=a[i].h-a[k].h+min(dp[k][0]+a[i].x2-a[k].x1,dp[k][1]+a[k].x2-a[i].x2);
    59             return;
    60 
    61         }
    62         k++;
    63     }
    64    if(a[i].h-a[k].h>MAXH)//不能到达下一平台
    65         dp[i][1]=INF;
    66     else//直接落地
    67         dp[i][1]=a[i].h;
    68 
    69     return;
    70 }
    71 int main()
    72 {
    73     cin >> T;
    74     while(T--)
    75     {
    76         memset(dp,0,sizeof(dp));
    77         a[0].x1=-20000,a[0].x2=20000,a[0].h=0;//大地
    78         cin >> N>>X>>Y>>MAXH;
    79         a[1].x1=X,a[1].x2=X,a[1].h=Y;//初始位置
    80         for(int i=2; i<=N+1; i++)
    81         {
    82             cin >> a[i].x1 >> a[i].x2 >> a[i].h;
    83         }
    84         sort(a,a+N+2,cmp);
    85         for(int i=N; i>=0; i--)
    86         {
    87             LeftTime(i);//
    88             RightTime(i);//
    89         }
    90         int MinTime=min(dp[0][0],dp[0][1]);
    91         cout << MinTime <<endl;
    92     }
    93     return 0;
    94 }
  • 相关阅读:
    移动函数的封装示例
    如何从不均衡类中进行机器学习
    DPM(Deformable Parts Model)--原理(一)
    K-means聚类算法
    机器学习中对核函数的理解
    总结:Bias(偏差),Error(误差),Variance(方差)及CV(交叉验证)
    技术干货
    神经网络入门
    目标函数、损失函数、代价函数
    地铁客流检测训练问题记录
  • 原文地址:https://www.cnblogs.com/sky-stars/p/10950157.html
Copyright © 2011-2022 走看看