B - Help Jimmy

Time Limit: 1000/1000MS (C++/Others) Memory Limit: 65536/65536KB (C++/Others)

Problem 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 恰好落在某个平台的边缘,被视为落在平台上。所有的平台均不重叠或相连。测试数据保Jimmy一定能安全到达地面。

Output

对输入的每组测试数据,输出一个整数,Jimmy到地面时可能的最早时间。

Sample Input

1
3 8 17 20
0 10 8
0 10 13
4 14 3

Sample Output

23

#include<cstdio>
#include<algorithm>
using namespace std; const int inf = 0x3f3f3f3f; // 表示无限大 大约是1e9多一点 struct Node { // 结构体数组用于记录每个位置的状态
int l, r, h; // 当前位置的左右端点、高度
int t, lt, rt; // 到达当前位置的时间、到达当前位置左右端点的时间
bool operator < (const Node& b) const{ // 重载运算符用于排序,按照高度降序排序
return h > b.h;
}
}a[]; int main()
{
int T, n, x, y, max;
scanf("%d", &T);
while(T--) { // T组测试样例
scanf("%d%d%d%d", &n, &x, &y, &max); a[].l = a[].r = x;
a[].t = a[].lt = a[].rt = ;
a[].h = y;
// 给a[0]赋值,代表初始的位置,左右边界都是x,左右时间都是0,高度为y for(int i=; i<=n; i++)
scanf("%d%d%d", &a[i].l, &a[i].r, &a[i].h);
// 输入每个平台的左右端点和高度,下标[1, n] a[n+].l = -;
a[n+].r = ;
a[n+].h = ;
// 给a[n+1]赋值,左右边界都到题目要求的最大值,表示地面 sort(a, a+n+);
// 按照高度降序,给n+2个元素排序 for(int i=; i<n+; i++){ // 按照高度降序,计算到达平台的时间
a[i].t = a[i].lt = a[i].rt = inf; // 到达平台的时间一开始置为无限大
for(int j=i-; j>=; j--){ // 必须是倒序遍历,因为里面有break
if(a[j].h - a[i].h > max) break; // 超过高度则跳出,因为降序
if(a[j].l >= a[i].l && a[j].l <= a[i].r){ // a[j]从左侧落下可以落在i上
int down_time = a[j].h - a[i].h; // 下落时间
int movel_time = a[j].l - a[i].l; // 下落后,移动到左端点的时间
int mover_time = a[i].r - a[j].l; // 下落后,移动到右端点的时间
// 更新取min
a[i].t = min(a[i].t, a[j].lt + down_time);
a[i].lt = min(a[i].lt, a[j].lt + down_time + movel_time);
a[i].rt = min(a[i].rt, a[j].lt + down_time + mover_time);
a[j].l = -; // 因为从从a[j]下落后一定只能落在一个平台上,
// 为了避免重复,把a[j]的左端点置为最小值
} if(a[j].r >= a[i].l && a[j].r <= a[i].r){ // a[j]从右侧落下可以落在i上,
// 一定不能用else if
int down_time = a[j].h - a[i].h;
int movel_time = a[j].r - a[i].l;
int mover_time = a[i].r - a[j].r;
a[i].t = min(a[i].t, a[j].rt + down_time);
a[i].lt = min(a[i].lt, a[j].rt + down_time + movel_time);
a[i].rt = min(a[i].rt, a[j].rt + down_time + mover_time);
a[j].r = ;
}
}
}
printf("%d\n", a[n+].t); // 输出到达地面的时间即可
}
return ;
}

B - Help Jimmy的更多相关文章

  1. 递归,动态规划,找最短路径,Help Jimmy

    题目链接:http://poj.org/problem?id=1661 解题报告: 1.老鼠每次来到一块木板上都只有两条路可以走,可以使用递归 #include <stdio.h> #in ...

  2. Why did Jimmy Wales invest in Quora? Is he afraid that it will take over Wikipedia?

    QUESTION: Why did Jimmy Wales invest in Quora? Is he afraid that it will take over Wikipedia? Answer ...

  3. POJ 1661 Help Jimmy (dijkstra,最短路)

    刚在百度搜索了一下这道题的题解, 因为看到有别人用动态规划做的,所以想参考一下. 结果顺带发现了有那么几个网站,上面的文章竟然和我这篇一模一样(除了一些明显的错别字外),我去,作者还是同一个人Admi ...

  4. POJ 1661 Help Jimmy -- 动态规划

    题目地址:http://poj.org/problem?id=1661 Description "Help Jimmy" 是在下图所示的场景上完成的游戏. 场景中包括多个长度和高度 ...

  5. OpenJudge/Poj 1661 帮助 Jimmy

    1.链接地址: bailian.openjudge.cn/practice/1661 http://poj.org/problem?id=1661 2.题目: 总Time Limit: 1000ms ...

  6. POJ 1661 Help Jimmy DP

    思路:Jimmy 跳到一块板上后,可以有两种选择,向左走或向右走.走到左端和走到右端所需的时间,容易算出. n如果我们能知道,以左端为起点到达地面的最短时间,和以右端为起点到达地面的最短时间,那么向左 ...

  7. POJ1661 Help Jimmy

    Help Jimmy Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9863 Accepted: 3201 Descriptio ...

  8. Jimmy Choo_百度百科

    Jimmy Choo_百度百科 Jimmy Choo

  9. POJ 1661 Help Jimmy(DP,注意边界)

    Help Jimmy Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9399   Accepted: 3025 Descri ...

  10. 新概念英语(1-101)A Card From Jimmy

    Lesson 101 A card from Jimmy 吉米的明信片 Listen to the tape then answer this question. Does Grandmother s ...

随机推荐

  1. 【洛谷P1525】[NOIP2010]关押罪犯

    关押罪犯 题目链接 思路: 二分图或并查集 这里讲并查集算法: 1.将每对罪犯的冲突关系按影响从大到小排序 2.将集合与(i+n)合并表示编号为i的罪犯不能在该集合内 3.依次从大到小处理冲突关系: ...

  2. 【杂题总汇】NOIP2013(洛谷P1967) 货车运输

    [洛谷P1967] 货车运输 重做NOIP提高组ing... +传送门-洛谷P1967+ ◇ 题目(copy from 洛谷) 题目描述 A国有n座城市,编号从1到n,城市之间有m条双向道路.每一条道 ...

  3. python导包语句执行

    今天在做项目中遇到一个问题,在first_page中引用login的登录方法,第一次执行登录可以正常登录,登录成功后,再选择返回主菜单,回到上个页面,再选择登录时报错“login_class isno ...

  4. js函数的默认参数

    function f(flag, start, end, msg){ flag = flag == false ? flag : true; start = start || null; start ...

  5. python3 井字棋 GUI - 人机对战、机器对战 (threading、tkinter库)

    python3 井字棋 GUI - 人机对战.机器对战 功能 GUI界面 人机对战(可选择机器先走) 机器对战(50局) 流程图 内核 棋盘 [0][1][2] [3][4][5] [6][7][8] ...

  6. Python学习之购物车

    实现功能: 程序启动,提示用户输入用户名和密码,程序读取余额文件last_salary.txt内容(文件不存在则自动创建),若文件内容为空则提示“首次登录,请输入工资”: 用户可以输入商品编号进行购买 ...

  7. 汇编语言编写Hello World

    ;================================= ; HELLO world DATAS segment string DB 'HELLO World','$' DATAS end ...

  8. openwrt(三) 固件的烧录

    导航: 方法1: tftp: 方法2: 在线升级 方法3: BIOS烧录 方法1:TFTP 这应该是最万能的一种方法了.TFTP是一种依靠网口传送数据的一种通信协议,没错,只是传输数据,并不是烧录,所 ...

  9. 笔记-python-module导入技巧

    笔记-python-module导入技巧 1.      module导入技巧 1.1.    控制模块导入内容 在模块中定义 __all__ = [] 不多言,主要是影响from <> ...

  10. 笔记-pytho-语法-yield

    笔记-python-语法-yield 1.      yield 1.1.    yield基本使用 def fab(max): n,a,b = 0, 0, 1 while n < max: y ...