• POJ1661 Help Jimmy


    Help Jimmy

    Time Limit: 1000MS
    Memory Limit: 10000K

    Total Submissions: 9863
    Accepted: 3201

    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

    Source

    POJ Monthly--2004.05.15 CEOI 2000

    [Submit]   [Go Back]   [Status]   [Discuss]

    解题思路:

    Jimmy跳到一块板上时有向左向右两种选择。通过左端为起点和右端为起点到达地面的最短时间可以判断出选择那条路,然后开始递归。首先要将平台从高到低排序。

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<iostream>
     4 #include<stdlib.h>
     5 #include<algorithm>
     6 #define MAX_N 1000
     7 #define INFINITE 1000000
     8 int t, n, x, y, Max;
     9 struct Platform {
    10     int Lx, Rx, h;
    11 };
    12 Platform aPlatform[MAX_N + 10];
    13 int aLeftMinTime[MAX_N + 10];
    14 int aRightMinTime[MAX_N + 10];
    15 
    16 int MyCompare(const void * e1, const void * e2) {
    17     Platform* p1, * p2;
    18     p1 = (Platform*) e1;
    19     p2 = (Platform*) e2;
    20     return p2 -> h - p1 -> h;
    21 }
    22 
    23 int MinTime(int L, bool bLeft) {
    24     int y = aPlatform[L].h;
    25     int x, i;
    26     if(bLeft)
    27         x = aPlatform[L].Lx;
    28     else
    29         x = aPlatform[L].Rx;
    30     for(i = L + 1; i <= n; i++) {
    31         if(aPlatform[i].Lx <= x && aPlatform[i].Rx >= x)
    32             break;
    33     }
    34     if(i <= n) {
    35         if(y - aPlatform[i].h > Max)
    36             return INFINITE;
    37     } else {
    38         if(y > Max)
    39             return INFINITE;
    40         else
    41             return y;
    42     }
    43     int nLeftTime = y - aPlatform[i].h + x - aPlatform[i].Lx;
    44     int nRightTime = y - aPlatform[i].h + aPlatform[i].Rx - x;
    45     if(aLeftMinTime[i] == -1)
    46         aLeftMinTime[i] = MinTime(i, true);
    47     if(aRightMinTime[i] == -1)
    48         aRightMinTime[i] = MinTime(i, false);
    49     nLeftTime += aLeftMinTime[i];
    50     nRightTime += aRightMinTime[i];
    51     if(nLeftTime < nRightTime)
    52         return nLeftTime;
    53     return nRightTime;
    54 }
    55 
    56 int main() {
    57     scanf("%d", &t);
    58     for(int i = 0; i < t; i++) {
    59         memset(aLeftMinTime, -1, sizeof(aLeftMinTime));
    60         memset(aRightMinTime, -1, sizeof(aRightMinTime));
    61         scanf("%d%d%d%d", &n, &x, &y, &Max);
    62         aPlatform[0].Lx = x;
    63         aPlatform[0].Rx = x;
    64         aPlatform[0].h = y;
    65         for(int j = 1; j <= n; j++) {
    66             scanf("%d%d%d", &aPlatform[j].Lx, &aPlatform[j].Rx, &aPlatform[j].h);
    67         }
    68         qsort(aPlatform, n + 1, sizeof(Platform), MyCompare);
    69         printf("%d
    ", MinTime(0, true));
    70     }
    71     return 0;
    72 }
    73 
    74 
    75 /*
    76 1
    77 3 8 17 20
    78 0 10 8
    79 0 10 13
    80 4 14 3
    81 
    82 23
    83 
    84 */
    View Code
     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<string.h>
     4 #include<algorithm>
     5 #include<stdlib.h>
     6 #define MAX 1010
     7 #define INI 1000000
     8 
     9 struct Platform {
    10     int x1, x2, h;
    11 } p[MAX];
    12 
    13 int LeftMinTime[MAX];
    14 int RightMinTime[MAX];
    15 int n, x, y, Max;
    16 
    17 int cmp(const void *e1, const void *e2) {
    18     Platform *p1, *p2;
    19     p1 = (Platform*) e1;
    20     p2 = (Platform*) e2;
    21     return p2 -> h - p1 -> h;
    22 }
    23 
    24 int main() {
    25     int t;
    26     scanf("%d", &t);
    27     while(t--) {
    28         memset(LeftMinTime, -1, sizeof(LeftMinTime));
    29         memset(RightMinTime, -1, sizeof(RightMinTime));
    30         scanf("%d%d%d%d", &n, &x, &y, &Max);
    31         p[0].x1 = x;
    32         p[0].x2 = x;
    33         p[0].h = y;
    34         for(int i = 1; i <= n; i++) {
    35             scanf("%d%d%d", &p[i].x1, &p[i].x2, &p[i].h);
    36         }
    37         qsort(p, n + 1, sizeof(Platform), cmp);
    38         LeftMinTime[n] = p[n].h;
    39         RightMinTime[n] = p[n].h;
    40         for(int i = n - 1; i >= 0; i--) {
    41             for(int j = i + 1; j <= n; j++) {
    42                 if(p[i].x1 >= p[j].x1 && p[i].x1 <= p[j].x2 && LeftMinTime[i] == -1) {
    43                     int nLeftMinTime = LeftMinTime[j] + p[i].h - p[j].h + p[i].x1 - p[j].x1;
    44                     int nRightMinTime = RightMinTime[j] + p[i].h - p[j].h + p[j].x2 - p[i].x1;
    45                     if(nLeftMinTime < nRightMinTime) {
    46                         LeftMinTime[i] = nLeftMinTime;
    47                     } else LeftMinTime[i] = nRightMinTime;
    48                 }
    49                 if(p[i].x2 >= p[j].x1 && p[i].x2 <= p[j].x2 && RightMinTime[i] == -1) {
    50                     int nLeftMinTime = LeftMinTime[j] + p[i].h - p[j].h + p[i].x2 - p[j].x1;
    51                     int nRightMinTime = RightMinTime[j] + p[i].h - p[j].h + p[j].x2 - p[i].x2;
    52                     if(nLeftMinTime < nRightMinTime)
    53                         RightMinTime[i] = nLeftMinTime;
    54                     else RightMinTime[i] = nRightMinTime;
    55                 }
    56                 if(LeftMinTime[i] == -1) {
    57                     if(p[i].h > Max)
    58                         LeftMinTime[i] = INI;
    59                     else LeftMinTime[i] = p[i].h;
    60                 }
    61                 if(RightMinTime[i] == -1) {
    62                     if(p[i].h > Max)
    63                         RightMinTime[i] = INI;
    64                     else RightMinTime[i] = p[i].h;
    65                 }
    66             }
    67         }
    68         printf("%d
    ", LeftMinTime[0]);
    69     }
    70     return 0;
    71 }
    View Code

    第一种是递归的方法(摘自教材)。第二种为非递归方法,然而并没有AC,暂时没有改对。

  • 相关阅读:
    业余草 SpringCloud教程 | 第十一篇: 断路器监控(Hystrix Dashboard)(Finchley版本)
    业余草 SpringCloud教程 | 第十篇: 高可用的服务注册中心(Finchley版本)
    业余草 SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)(Finchley版本)
    业余草 SpringCloud教程 | 第八篇: 消息总线(Spring Cloud Bus)(Finchley版本)
    业余草 SpringCloud教程 | 第七篇: 高可用的分布式配置中心(Spring Cloud Config)(Finchley版本)
    POJ2135 Farm Tour
    POJ1149 PIGS
    POJ3041 Asteroids
    2020.7.4模拟 数据结构 (ds)
    2020.7.4模拟 浇花 (flower)
  • 原文地址:https://www.cnblogs.com/xzrmdx/p/5152259.html
Copyright © 2020-2023  润新知