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

 #include<stdio.h>
#include<string.h>
#include<iostream>
#include<stdlib.h>
#include<algorithm>
#define MAX_N 1000
#define INFINITE 1000000
int t, n, x, y, Max;
struct Platform {
int Lx, Rx, h;
};
Platform aPlatform[MAX_N + ];
int aLeftMinTime[MAX_N + ];
int aRightMinTime[MAX_N + ]; int MyCompare(const void * e1, const void * e2) {
Platform* p1, * p2;
p1 = (Platform*) e1;
p2 = (Platform*) e2;
return p2 -> h - p1 -> h;
} int MinTime(int L, bool bLeft) {
int y = aPlatform[L].h;
int x, i;
if(bLeft)
x = aPlatform[L].Lx;
else
x = aPlatform[L].Rx;
for(i = L + ; i <= n; i++) {
if(aPlatform[i].Lx <= x && aPlatform[i].Rx >= x)
break;
}
if(i <= n) {
if(y - aPlatform[i].h > Max)
return INFINITE;
} else {
if(y > Max)
return INFINITE;
else
return y;
}
int nLeftTime = y - aPlatform[i].h + x - aPlatform[i].Lx;
int nRightTime = y - aPlatform[i].h + aPlatform[i].Rx - x;
if(aLeftMinTime[i] == -)
aLeftMinTime[i] = MinTime(i, true);
if(aRightMinTime[i] == -)
aRightMinTime[i] = MinTime(i, false);
nLeftTime += aLeftMinTime[i];
nRightTime += aRightMinTime[i];
if(nLeftTime < nRightTime)
return nLeftTime;
return nRightTime;
} int main() {
scanf("%d", &t);
for(int i = ; i < t; i++) {
memset(aLeftMinTime, -, sizeof(aLeftMinTime));
memset(aRightMinTime, -, sizeof(aRightMinTime));
scanf("%d%d%d%d", &n, &x, &y, &Max);
aPlatform[].Lx = x;
aPlatform[].Rx = x;
aPlatform[].h = y;
for(int j = ; j <= n; j++) {
scanf("%d%d%d", &aPlatform[j].Lx, &aPlatform[j].Rx, &aPlatform[j].h);
}
qsort(aPlatform, n + , sizeof(Platform), MyCompare);
printf("%d\n", MinTime(, true));
}
return ;
} /*
1
3 8 17 20
0 10 8
0 10 13
4 14 3 23 */
 #include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
#define MAX 1010
#define INI 1000000 struct Platform {
int x1, x2, h;
} p[MAX]; int LeftMinTime[MAX];
int RightMinTime[MAX];
int n, x, y, Max; int cmp(const void *e1, const void *e2) {
Platform *p1, *p2;
p1 = (Platform*) e1;
p2 = (Platform*) e2;
return p2 -> h - p1 -> h;
} int main() {
int t;
scanf("%d", &t);
while(t--) {
memset(LeftMinTime, -, sizeof(LeftMinTime));
memset(RightMinTime, -, sizeof(RightMinTime));
scanf("%d%d%d%d", &n, &x, &y, &Max);
p[].x1 = x;
p[].x2 = x;
p[].h = y;
for(int i = ; i <= n; i++) {
scanf("%d%d%d", &p[i].x1, &p[i].x2, &p[i].h);
}
qsort(p, n + , sizeof(Platform), cmp);
LeftMinTime[n] = p[n].h;
RightMinTime[n] = p[n].h;
for(int i = n - ; i >= ; i--) {
for(int j = i + ; j <= n; j++) {
if(p[i].x1 >= p[j].x1 && p[i].x1 <= p[j].x2 && LeftMinTime[i] == -) {
int nLeftMinTime = LeftMinTime[j] + p[i].h - p[j].h + p[i].x1 - p[j].x1;
int nRightMinTime = RightMinTime[j] + p[i].h - p[j].h + p[j].x2 - p[i].x1;
if(nLeftMinTime < nRightMinTime) {
LeftMinTime[i] = nLeftMinTime;
} else LeftMinTime[i] = nRightMinTime;
}
if(p[i].x2 >= p[j].x1 && p[i].x2 <= p[j].x2 && RightMinTime[i] == -) {
int nLeftMinTime = LeftMinTime[j] + p[i].h - p[j].h + p[i].x2 - p[j].x1;
int nRightMinTime = RightMinTime[j] + p[i].h - p[j].h + p[j].x2 - p[i].x2;
if(nLeftMinTime < nRightMinTime)
RightMinTime[i] = nLeftMinTime;
else RightMinTime[i] = nRightMinTime;
}
if(LeftMinTime[i] == -) {
if(p[i].h > Max)
LeftMinTime[i] = INI;
else LeftMinTime[i] = p[i].h;
}
if(RightMinTime[i] == -) {
if(p[i].h > Max)
RightMinTime[i] = INI;
else RightMinTime[i] = p[i].h;
}
}
}
printf("%d\n", LeftMinTime[]);
}
return ;
}

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

POJ1661 Help Jimmy的更多相关文章

  1. 【动态规划】POJ1661 Help Jimmy

    Help Jimmy Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11621   Accepted: 3827 Descr ...

  2. kuangbin专题十二 POJ1661 Help Jimmy (dp)

    Help Jimmy Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 14214   Accepted: 4729 Descr ...

  3. POJ1661 Help Jimmy —— DP

    题目链接:http://poj.org/problem?id=1661 Help Jimmy Time Limit: 1000MS   Memory Limit: 10000K Total Submi ...

  4. [kuangbin带你飞]专题十二 基础DP1

            ID Origin Title   167 / 465 Problem A HDU 1024 Max Sum Plus Plus   234 / 372 Problem B HDU 1 ...

  5. 「kuangbin带你飞」专题十二 基础DP

    layout: post title: 「kuangbin带你飞」专题十二 基础DP author: "luowentaoaa" catalog: true tags: mathj ...

  6. Help Jimmy ~poj-1661 基础DP

    Help Jimmy" 是在下图所示的场景上完成的游戏. 场景中包括多个长度和高度各不相同的平台.地面是最低的平台,高度为零,长度无限. Jimmy老鼠在时刻0从高于所有平台的某处开始下落, ...

  7. 动态规划3--Help Jimmy

    动态规划3--Help Jimmy 一.心得 二.题目 三.分析 Jimmy跳到一块板上后,可以有两种选择,向左走,或向右走.走到左端和走到右端所需的时间,是很容易算的.如果我们能知道,以左端为起点到 ...

  8. 【POJ - 1661】Help Jimmy (动态规划)

    Help Jimmy Descriptions: "Help Jimmy" 是在下图所示的场景上完成的游戏. 场景中包括多个长度和高度各不相同的平台.地面是最低的平台,高度为零,长 ...

  9. POJ-1661-Help Jimmy(DP, 递推)

    链接: https://vjudge.net/problem/POJ-1661 题意: "Help Jimmy" 是在下图所示的场景上完成的游戏. 场景中包括多个长度和高度各不相同 ...

随机推荐

  1. 多线程(NSThread、NSOperation、GCD)编程浅谈

    一.基本概念 进程:一个具有一定独立功能的程序关于某个数据集合的一次运行活动.可以理解成一个运行中的应用程序.线程:程序执行流的最小单元,线程是进程中的一个实体.同步:只能在当前线程按先后顺序依次执行 ...

  2. HttpClient4.0

    ****************************HttpClient4.0用法***************************** 1.初始化HttpParams,设置组件参数 //Ht ...

  3. JavaScript细节整理

    JavaScript是一个绝冠全球的编程语言,可用于Web开发.移动应用开发(PhoneGap.Appcelerator).服务器端开发(Node.js和Wakanda)等等.JavaScript还是 ...

  4. (转)织梦DedeCMSv5.7安装体验数据包的方法

    1.先安装一个全新的DedeCMS v5.7 GBK系统,这里以DedeCMS v5.7 GBK系统为例. 2.下载数据体验包: 如果是gbk则下载:http://www.dedecms.com/de ...

  5. Asp.net 导航条【1】

    PHP比较成熟的开放的源代码比较多,比方说PrestaShop,比方说Discuz!...... 虽然语言不同,但基本原理是一样的,有时间的话读一读,对学习ASP.NET应该是非常有好处的(唉,什么时 ...

  6. idea sass scss配置

    1.安装Ruby win  直接http://rj.baidu.com/soft/detail/22711.html?ald mac linux https://ruby.taobao.org/ 可下 ...

  7. 测试stopwatch频率

    测试stopwatch频率 using UnityEngine; using System.Collections; using System.Diagnostics; public class te ...

  8. android 05

    控件:RadioButton CheckedBox RatingBar ProgressBar 下拉列表:ListView Spinner <!-- 单选按钮必须放在单选按钮组当中才能生效 ,并 ...

  9. 用core dump来调试程序段错误

    有的程序可以通过编译, 但在运行时会出现Segment fault(段错误). 这通常都是指针错误引起的.但这不像编译错误一样会提示到文件->行, 而是没有任何信息, 使得我们的调试变得困难起来 ...

  10. [LeetCode OJ] Linked List Cycle II—Given a linked list, return the node where the cycle begins. If there is no cycle, return null.

    /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode ...