2021-08-01

这周主要是对mooc平台的动态规划做了一些练习,其中个人觉得还是对help Jimmy 这个问题比较感兴趣,一方面是老师在视频中也有讲解,其次,这个题目的趣味性还是不错的,接下来就和大家分享一下。

2021-08-01

场景中包括多个长度和高度各不相同的平台。地面是最低的平台,高度为零,长度无限。
Jimmy老鼠在时刻0从高于所有平台的某处开始下落,它的下落速度始终为1米/秒。
当Jimmy落到某个平台上时,游戏者选择让它向左还是向右跑,它跑动的速度也是1米/秒。
当Jimmy跑到平台的边缘时,开始继续下落。Jimmy每次下落的高度不能超过MAX米,不然就会摔死,游戏也会结束。
设计一个程序,计算Jimmy到地面时可能的最早时间。

输入数据
第一行是测试数据的组数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到地面时可能的最早时间。
输入样例
1
3 8 17 20
0 10 8
0 10 13
4 14 3
输出样例
23

解题思路
首先在拿到这个题目的时候脑子里有一种熟悉的感觉,除去题目要求的计算到到地面的时间之外,就类似于期末大作业的小组汇报展示,下楼梯:用拍接球等小组结果。
其次,Jimmy从最初下落的地方到达板和每一次从板上落点走到板的左端或者右端的时间是很好计算的,只需要算出每一次下落时间即可,这样我们要解决的问题就是,每一次从左端或者右端作为起点到地面的最短时间,当我们把这些问题求出来,那么从最开始的地方下落到地面的时间就可以通过每次不断的对下一次版的状态的判断选择来得出。从板落到地面所需的最短时间用数组mintime[]来存储。这里设如果一次下落的距离超过MAX,则时间mintime[]为无穷(INFINITE),则从某一块板k的左端下落到地面的最短时间可以这样算:
if(板k下方没有任何板)
{
if(high[k] > MAX) leftmintime[k] = INFINITE;
else leftmintime[k](以板的左端作为起点开始下落所需的最短时间)= high[k](每块板到地面的高度);
}
else if(板k下方有板m)
{
if(high[k] - high[m] > MAX) mintime[k] = INFINITE;
else leftmintime[k] = min(leftmintime[m]+lx(k)(板的左端横坐标,)-lx(m), rightmintime[m] +rx(m)(板的右端横坐标)
-lx(k)+ high[k] - high[m];
}

剩下的也按类似的方法解决即可。
2021-08-01
2021-08-01

jsj201 zhong

上一篇:MySQL之索引


下一篇:2021-07-31 算法笔记Visualgo