poj1661:Help Jimmy
来源:互联网 发布:关于淘宝美工工作流程 编辑:程序博客网 时间:2024/05/21 10:21
Help Jimmy
Time Limit: 1000MSMemory Limit: 10000KTotal Submissions: 7811Accepted: 2481
Description
"Help Jimmy"是在下图所示的场景上完成的游戏。
场景中包括多个长度和高度各不相同的平台。地面是最低的平台,高度为零,长度无限。
Jimmy老鼠在时刻0从高于所有平台的某处开始下落,它的下落速度始终为1米/秒。当Jimmy落到某个平台上时,游戏者选择让它向左还是向右跑,它跑动的速度也是1米/秒。当Jimmy跑到平台的边缘时,开始继续下落。Jimmy每次下落的高度不能超过MAX米,不然就会摔死,游戏也会结束。
设计一个程序,计算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恰好落在某个平台的边缘,被视为落在平台上。所有的平台均不重叠或相连。测试数据保证问题一定有解。
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
当你爬上某个平台i后,就要考虑他往下跳的情况:1,直接落地,又有两种情况:1-1,摔死;1-2此时时间就是平台的高度;2,落到平台j上面,有两种情况:2-1,从i跳到j摔死;2-2,没摔死,求最小时间,跳到j后可以往左走或往右走,将他们的时间比较后得到最小时间。
C语言: ac代码
#include
#include
#define MAX 10000000; //时间为很大表示摔死;
structPlateform // 平台;
{
int lx; //左节点坐标;
int ry; //右节点坐标;
int h; //高度;
};
intCompare(const void*e1, const void*e2)
{
Plateform *p1, *p2;
p1 = (Plateform *) e1;
p2 = (Plateform *) e2;
return p1->h - p2->h;
}
intSolve(Plateform plate[1010], int N, int Max)
{
int left_plate[1010] = {0}; //平台的左坐标点到地面的最短距离;
int right_plate[1010] = {0}; //平台的有坐标点到地面的最短距离;
int i = 1;
int j, left, right;
left_plate[0] = plate[0].h;
right_plate[0] = plate[0].h;
//从最地端开始往上遍历;
for(i=1; i<=N; i++)
{
//左点坐标;
for(j = i-1; j >= 0; j--)
{
if(plate[i].lx >= plate[j].lx && plate[i].lx <= plate[j].ry) //寻找从i平台可以跳到i以下的某个平台上;
break;
}
if(j==-1) //直接跳到地面上;
{
if(plate[i].h <= Max) //跳的高度在能承受最大高度内;
left_plate[i] = plate[i].h; //从这个点到地面的最短距离为改点的高度;
else
left_plate[i] = MAX; //跳的高度大于能承受最大高度,左路不通;
}
else //没有跳到地面;
{
if(plate[i].h - plate[j].h <= Max)
#include
#define MAX 10000000;
struct
{
};
int
{
}
int
{