zoukankan      html  css  js  c++  java
  • 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,暂时没有改对。

  • 相关阅读:
    Effective Go(官方文档)笔记
    Python中的列表、元祖、字典
    obj-c编程15[Cocoa实例02]:KVC和KVO的实际运用
    HDU 3435A new Graph Game(网络流之最小费用流)
    蜗牛—Android基础之button监听器
    网络流小结
    Android 音频的播放之二MediaPlayer
    零基础学python-3.7 还有一个程序 python读写文本
    BEGINNING SHAREPOINT&#174; 2013 DEVELOPMENT 第11章节--为Office和SP解决方式开发集成Apps Office的JavaScript对象模型
    jdk的动态代理源代码解析
  • 原文地址:https://www.cnblogs.com/xzrmdx/p/5152259.html
Copyright © 2011-2022 走看看