help Jimmy(动态规划) (我觉得是此题最详细的解答!!!欢迎纠正)(附测试数据)...

本文主要是介绍help Jimmy(动态规划) (我觉得是此题最详细的解答!!!欢迎纠正)(附测试数据)...,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

"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



题解:
1.首先Jimmy是从高向低掉落,所以首先你需要将输入的板块按照高度的顺序由高到低排列,而且与其相对应的左右横坐标也需要更新
2.排序之后,思考Jimmy的位置,一开始,它的位置是一个点,那么他只可以垂直向下掉落,而且只有俩种情况
  (1)直接落地(前提是这个高度要小于MAX, 不然它就摔死了)
  (2)掉落到第一块板子上
3.要注意,板块不可以穿越!而且有一种边缘情况,就是你从上一块板块的边缘落下,正好落到了下一块的板块的边缘,它是可以停留的(就像之前手机上玩的游戏跳跳球一样)
4.重新回到Jimmy落到了一块板块的中央,这是先不管它, 你只需要知道它落到了哪个板块上, 并把它存储起来
5.这时我们从第一个板块说起,也就是最高的那个板块,我们来讨论从它的边缘下落问题,可以分为俩个问题, 从左边缘下落, 右边缘下落
  于是可以得到(以左边缘下落为例子,右边缘相同)
  if(板子k左端正下方没有别的板子){
    if(板子k的高度h(k)大于MAX)
      LeftMinTime(k) = INF(很大的数)
    else
      LeftMinTime(k) = h(k);
   }
   else if(板子k左端正下方的板子编号时m)//这里需要注意,仅当俩块板子的高度差小于MAX才能执行下面的语句,否则Jimmy会被摔死,则Time为INF(非常重要)
      LeftMinTime(k) = h(k) - h(m) + Min(LeftMinTime(m) + Lx(k) - Lx(m), RightMinTime(m) + Rx(m) - Lx(k));
  }
6.对于寻找下方是否有板子可以设置一个函数find
 int find(int x, int h) {//x为Jimmy所在的横坐标,h为当前板子的高度
    for (int i = 0; i < N; i++) {
        if (x >= X1[i] && x <= X2[i]) {
            if (h > H[i] && H[i] != 0)//这里要保证H[i]不为0,因为地面是0,树立在地面的板子是没有意义的
                return i;
        }
    }
    return -1;
 }

测试数据
23 8 7 2
6 14 6
4 10 4
5 14 21 6 10 20
2 3 5answer:
17 101
4 14 5 6
3 22 1
16 23 2
16 30 3
13 21 4
答案:15
1
2 2 12 8
0 10 10
2 12 5
答案:221
3 8 17 20
8 10 8
8 10 13
8 14 3
ans:171
60 822 302 50
813 823 298
813 823 293
816 826 213
816 826 178
817 827 218
813 823 148
821 831 73
814 824 248
813 823 283
815 825 158
819 829 58
814 824 13
813 823 28
819 829 233
814 824 43
773 783 293
821 831 93
818 828 268
816 826 198
818 828 113
814 824 208
816 826 68
821 831 133
794 804 248
814 824 108
829 839 28
818 828 143
844 854 298
802 812 133
801 811 28
818 828 238
817 827 8
816 826 48
820 830 3
819 829 288
822 832 138
820 830 183
855 865 13
777 787 268
820 830 63
789 799 28
822 832 33
855 865 213
779 789 208
836 846 248
806 816 33
821 831 263
818 828 83
846 856 263
789 799 68
854 864 8
854 864 283
801 811 298
805 815 143
822 832 23
821 831 173
813 823 153
858 868 138
818 828 98
839 849 133
答案:352 

 

代码 :
  1 #include<iostream>
  2 #include<algorithm>
  3 #include<cstring>
  4 using namespace std;
  5 
  6 static const int MAXLEN = 1010;
  7 
  8 #define INF 1e9;
  9 
 10 int t, N, X, Y, MAX;
 11 int X1[MAXLEN] = { 0 }, X2[MAXLEN] = { 0 }, H[MAXLEN] = { 0 }, LeftMinTime[MAXLEN] = { 0 }, RightMinTime[MAXLEN] = { 0 };
 12 
 13 void h_sort(int X1[], int X2[], int H[]) {
 14     for (int i = 0; i < N; i++) {
 15         for (int j = i + 1; j < N; j++) {
 16             if (H[j] > H[i]) {
 17                 int temp;
 18                 temp = H[i];
 19                 H[i] = H[j];
 20                 H[j] = temp;
 21                 temp = X1[i];
 22                 X1[i] = X1[j];
 23                 X1[j] = temp;
 24                 temp = X2[i];
 25                 X2[i] = X2[j];
 26                 X2[j] = temp;
 27             }
 28         }
 29     }
 30 }
 31 
 32 int find(int x, int h) {
 33     for (int i = 0; i < N; i++) {
 34         if (x >= X1[i] && x <= X2[i]) {
 35             if (h > H[i] && H[i] != 0)
 36                 return i;
 37         }
 38     }
 39     return -1;
 40 }
 41 
 42 int main() {
 43     cin >> t;
 44     while (t--) {
 45         memset(X1, 0, sizeof(X1));
 46         memset(X2, 0, sizeof(X2));
 47         memset(H, 0, sizeof(H));
 48         memset(LeftMinTime, 0, sizeof(LeftMinTime));
 49         memset(RightMinTime, 0, sizeof(RightMinTime));
 50         cin >> N >> X >> Y >> MAX;
 51         for (int i = 0; i < N; i++)
 52             cin >> X1[i] >> X2[i] >> H[i];
 53 
 54         //排序
 55         h_sort(X1, X2, H);
 56         //第一块板子 
 57         int key = find(X, Y);
 58 
 59         if (key == -1) {
 60             cout << Y << endl;
 61             continue;
 62         }
 63 
 64         for (int i = N - 1; i >= 0; i--) {
 65             int m = find(X1[i], H[i]);
 66             if (m == -1) {
 67                 if (H[i] > MAX) {
 68                     LeftMinTime[i] = INF;
 69                 }
 70                 else {
 71                     LeftMinTime[i] = H[i];
 72                 }
 73             }
 74             else {
 75                 if(H[i] - H[m] <= MAX)
 76                     LeftMinTime[i] = H[i] - H[m] + min(LeftMinTime[m] + X1[i] - X1[m], RightMinTime[m] + X2[m] - X1[i]);
 77                 else 
 78                     LeftMinTime[i] = INF;
 79             }
 80             int r = find(X2[i], H[i]);
 81             if (r == -1) {
 82                 if (H[i] > MAX) {
 83                     RightMinTime[i] = INF;
 84                 }
 85                 else {
 86                     RightMinTime[i] = H[i];
 87                 }
 88             }
 89             else {
 90                 if(H[i] - H[r] <= MAX)
 91                     RightMinTime[i] = H[i] - H[r] + min(LeftMinTime[r] + X2[i] - X1[r], RightMinTime[r] + X2[r] - X2[i]);
 92                 else
 93                     RightMinTime[i] = INF;
 94             }
 95         }
 96         int minTime = Y - H[key] + min(LeftMinTime[key] + X - X1[key], RightMinTime[key] + X2[key] - X);
 97         cout << minTime << endl;;
 98     }
 99     return 0;
100 }
 

 

 

这篇关于help Jimmy(动态规划) (我觉得是此题最详细的解答!!!欢迎纠正)(附测试数据)...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/533405

相关文章

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

动态规划---打家劫舍

题目: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 思路: 动态规划五部曲: 1.确定dp数组及含义 dp数组是一维数组,dp[i]代表

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同

poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111

poj 2976: 题意: 在n场考试中,每场考试共有b题,答对的题目有a题。 允许去掉k场考试,求能达到的最高正确率是多少。 解析: 假设已知准确率为x,则每场考试对于准确率的贡献值为: a - b * x,将贡献值大的排序排在前面舍弃掉后k个。 然后二分x就行了。 代码: #include <iostream>#include <cstdio>#incl

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d

沁恒CH32在MounRiver Studio上环境配置以及使用详细教程

目录 1.  RISC-V简介 2.  CPU架构现状 3.  MounRiver Studio软件下载 4.  MounRiver Studio软件安装 5.  MounRiver Studio软件介绍 6.  创建工程 7.  编译代码 1.  RISC-V简介         RISC就是精简指令集计算机(Reduced Instruction SetCom

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

arduino ide安装详细步骤

​ 大家好,我是程序员小羊! 前言: Arduino IDE 是一个专为编程 Arduino 微控制器设计的集成开发环境,使用起来非常方便。下面将介绍如何在不同平台上安装 Arduino IDE 的详细步骤,包括 Windows、Mac 和 Linux 系统。 一、在 Windows 上安装 Arduino IDE 1. 下载 Arduino IDE 打开 Arduino 官网

GPT系列之:GPT-1,GPT-2,GPT-3详细解读

一、GPT1 论文:Improving Language Understanding by Generative Pre-Training 链接:https://cdn.openai.com/research-covers/languageunsupervised/language_understanding_paper.pdf 启发点:生成loss和微调loss同时作用,让下游任务来适应预训

轨迹规划-B样条

B样条究竟是干啥的?白话就是给出一堆点,用样条的方式,给这些点连接起来,并保证丝滑的。 同时B样条分为准均匀和非均匀,以下为准均匀为例。 参考链接1:https://zhuanlan.zhihu.com/p/50626506https://zhuanlan.zhihu.com/p/50626506 参考链接2: https://zhuanlan.zhihu.com/p/536470972h