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跳到一块板上时有向左向右两种选择。通过左端为起点和右端为起点到达地面的最短时间可以判断出选择那条路,然后开始递归。首先要将平台从高到低排序。
#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的更多相关文章
- 【动态规划】POJ1661 Help Jimmy
Help Jimmy Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 11621 Accepted: 3827 Descr ...
- kuangbin专题十二 POJ1661 Help Jimmy (dp)
Help Jimmy Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 14214 Accepted: 4729 Descr ...
- POJ1661 Help Jimmy —— DP
题目链接:http://poj.org/problem?id=1661 Help Jimmy Time Limit: 1000MS Memory Limit: 10000K Total Submi ...
- [kuangbin带你飞]专题十二 基础DP1
ID Origin Title 167 / 465 Problem A HDU 1024 Max Sum Plus Plus 234 / 372 Problem B HDU 1 ...
- 「kuangbin带你飞」专题十二 基础DP
layout: post title: 「kuangbin带你飞」专题十二 基础DP author: "luowentaoaa" catalog: true tags: mathj ...
- Help Jimmy ~poj-1661 基础DP
Help Jimmy" 是在下图所示的场景上完成的游戏. 场景中包括多个长度和高度各不相同的平台.地面是最低的平台,高度为零,长度无限. Jimmy老鼠在时刻0从高于所有平台的某处开始下落, ...
- 动态规划3--Help Jimmy
动态规划3--Help Jimmy 一.心得 二.题目 三.分析 Jimmy跳到一块板上后,可以有两种选择,向左走,或向右走.走到左端和走到右端所需的时间,是很容易算的.如果我们能知道,以左端为起点到 ...
- 【POJ - 1661】Help Jimmy (动态规划)
Help Jimmy Descriptions: "Help Jimmy" 是在下图所示的场景上完成的游戏. 场景中包括多个长度和高度各不相同的平台.地面是最低的平台,高度为零,长 ...
- POJ-1661-Help Jimmy(DP, 递推)
链接: https://vjudge.net/problem/POJ-1661 题意: "Help Jimmy" 是在下图所示的场景上完成的游戏. 场景中包括多个长度和高度各不相同 ...
随机推荐
- Android ActionBar(转)
本文内容 关于 ActionBar 必要条件 项目结构 环境 演示一:Action Bar 显示隐藏 演示二:Action Item 显示菜单选项 演示三:Action Home 启用“返回/向上”程 ...
- 简单图片banner轮播
/**************[css]****************/ <style type="text/css"> *{margin:0px; ...
- 学习CSS一些事(上)
p.s:这是我在学习中总结出来知识,如有不对,请多包涵.谢谢. CSS样式:行内样式,内部样式,外部样式,他们的优先级是:行内,内部,外部,遵循就近原则. 一.HTML+CSS布局分为三大类,一是流式 ...
- [JS] 如何清空file input框 [整理]
测试环境:OS --> winXPBrowsers --> IE6+, FF 3.0.11, FF 3.5, Opera 9.64, Opera 10 beta 2, Safari 4, ...
- Oracle增加自增长列
-- 移除索引drop index TB_1;drop index TB_2 ;alter table TB drop constraint PK_TB; --允许列为空 alter table TB ...
- 【转】 iOS使用AVFoundation实现二维码扫描
原文:http://strivingboy.github.io/blog/2014/11/08/scan-qrcode/ 关于二维码扫描有不少优秀第三方库如: ZBar SDK 里面有详细的文档,相应 ...
- Reverse Interger
Reverse digits of an integer. Example1: x = 123, return 321Example2: x = -123, return -321 Have you ...
- jQuery中的综合动画
所谓综合动画,就是在链式表达式依次执行相关animate函数,其中的参数是以键值对的方式存在的. 如下示例,就展示了一个基本的综合动画. <!DOCTYPE html PUBLIC " ...
- python getpass模块:隐藏不显示输入的密码
不知道为什么,本机测试必须要在debug模式下才正常运行.. import getpass #用于隐藏用户输入的字符串,常用来接收密码 def checkuser(user,passwd): ': r ...
- 怎样在Swift中使用CocoaPods-b
最近关于CocoaPods有很多的议论.你可能从别的开发者那里听到过,或者在Github的目录中看到过.如果你之前从来没有用过,你可能会问,"CocoaPods到底是什么?" 它不 ...