问题描述

"Help Jimmy" 是在下图所示的场景上完成的游戏:

场景中包括多个长度和高度各不相同的平台。地面是最低的平台,高度为零,长度无限。

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

思路:

用一棵树形保存每一个平台,然后递归求解

#include <stdio.h>
#include <stdlib.h>
struct Line
{int x1;int x2;int h;Line * Parent;Line * Left;Line * Right;
};Line *line;
int cmp(const void * a,const void * b)
{Line *m,*n;m=(Line *)a;n=(Line *)b;if(m->h>n->h)return -1;else if(m->h==n->h){if(m->x1>n->x1)return -1;else return 1;}else {return 1;}
}
void tree(Line * lp,int i,int n,int max)
{if(i+1<n-1){if(lp[i].x2>=lp[i+1].x2){lp[i].Left=&lp[i+1];tree(lp,i+1,n,max);if(i+2<n-1){for(int k=i+2;k<n;k++){if(lp[i].h-lp[k].h<=max){if(k==n-1){lp[i].Right=&lp[k];tree(lp,k,n,max);break;}else if(lp[i].x1<=lp[k].x1){lp[i].Right=&lp[k];tree(lp,k,n,max);break;}else {}}else{lp[i].Right=NULL;break;}}//for}else{lp[i].Right=&lp[n];}}else{lp[i].Right=&lp[i+1];tree(lp,i+1,n,max);for(int k=i+2;k<n;k++){if(lp[i].h-lp[k].h<=max){if(k==n-1){lp[i].Left=&lp[k];tree(lp,k,n,max);break;}else if(lp[i].x2>=lp[k].x2){lp[i].Left=&lp[k];tree(lp,k,n,max);break;}else{}}else{lp[i].Left=NULL;break;}}//for}}else{lp[i].Left=&lp[n];lp[i].Right=&lp[n];}
}int min(int a,int b)
{if(a<b)return a;else return b;
}int cal(Line * lp,int x)
{if(lp->Left==lp->Right){return min(lp->x2-x,x-lp->x1);}if(lp==NULL)return 10000000;return min(x-lp->x1+cal(lp->Left,lp->x1),lp->x2-x+cal(lp->Right,lp->x2));
}int main()
{int t;scanf("%d",&t);for(int i=0;i<t;i++){int n,x,y,max;int res=0;scanf("%d%d%d%d",&n,&x,&y,&max);line=new Line[n+1];for(int i=0;i<n;i++){scanf("%d%d%d",&line[i].x1,&line[i].x2,&line[i].h);}//read itemsline[n].h=0;line[n].x1=0;line[n].x2=200000000;qsort(line,n+1,sizeof(Line),cmp);//sort items by highttree(line,0,n+1,max);res=y+cal(line,x);/*for(int i=0;i<n;i++){printf("line %d\nx1=%d  x2=%d  h=%d \n",i,line[i].x1,line[i].x2,line[i].h);}*/printf("%d\n",res);delete []line;}}

  

转载于:https://www.cnblogs.com/c840136/articles/2179365.html

Help Jimmy(递归)相关推荐

  1. 克罗内克递归单元(论文翻译)

    Kronecker Recurrent Units Cijo Jose Idiap Research Institute & EPFL cijo.jose@idiap.ch Moustapha ...

  2. 算法设计思想(5)— 递归法

    1. 递归概念 递归 Recursion是指在函数的定义中使用函数自身的方法,直观上来看,就是某个函数自己调用自己. ​ 递归有两层含义: 递归问题必须可以分解为若干个规模较小.与原问题形式相同的子问 ...

  3. 判断某数组是不是二叉树的后序遍历序列 python递归与非递归解法

    python 递归 class Solution:def VerifySquenceOfBST(self, sequence):# write code hereif len(sequence) &l ...

  4. 翻转二叉树 c语言实现 递归 栈 队列

    前言 题目比较好理解,就是翻转二叉树 代码 c语言实现 #include<stdio.h> #include<stdlib.h> #include<string.h> ...

  5. 快速排序的递归和非递归实现 c语言版本

    代码 挖坑法 解释 选取一个关键字(key)作为枢轴,一般取整组记录的第一个数/最后一个,这里采用选取序列第一个数为枢轴,也是初始的坑位. 设置两个变量i = l;j = r;其中l = 0, r = ...

  6. LeetCode 10. Regular Expression Matching python特性、动态规划、递归

    前言 本文主要提供三种不同的解法,分别是利用python的特性.动态规划.递归方法解决这个问题 使用python正则属性 import reclass Solution2:# @return a bo ...

  7. 迭代是人,递归是神(迭代与递归的总结:比较)

    https://www.cnblogs.com/Renyi-Fan/p/7708012.html 在计算机编程实现中有常常两种方法:一曰迭代(iterate):二曰递归(recursion). 从&q ...

  8. java锁(公平锁和非公平锁、可重入锁(又名递归锁)、自旋锁、独占锁(写)/共享锁(读)/互斥锁、读写锁)

    前言 本文对Java的一些锁的概念和实现做个整理,涉及:公平锁和非公平锁.可重入锁(又名递归锁).自旋锁.独占锁(写)/共享锁(读)/互斥锁.读写锁 公平锁和非公平锁 概念 公平锁是指多个线程按照申请 ...

  9. Mysql中的递归层次查询(父子查询,无限极查询)

    前言:最近面试的时候遇到公司要求只能用SQL来查询无限极的数据,不能用PHP程序做递归查询,现在分享方法. 下面给出一个function来完成的方法 下面是sql脚本,想要运行的直接赋值粘贴进数据库即 ...

最新文章

  1. R语言偏相关或者部分相关性系数计算实战:通过拟合两个回归模型、或者pysch包计算偏相关系数(Partial Correlation)、通过方差分析获得偏相关系数的F统计量(偏F检验、二型检验)
  2. 皮一皮:流散国外的珍宝。。。
  3. MAC版Pycharm主题——WarmColor
  4. MBB IN CONSULTING
  5. 这些表情包你有吗?来 Battle 啊
  6. 网格搜索支持向量机运行结束不了
  7. P2911 [USACO08OCT]Bovine Bones G (python3实现)
  8. Android OkHttp经验小结
  9. 如何设置任务栏和开始菜单属性中的 分组相似任务栏按钮 的个数
  10. Flashlight should be gray after finishing Recor...
  11. 斐讯k2p 月光银 硬件版本A2-软件版本22.7.8.5 刷官改系统
  12. 网吧 电影服务器系统,XBS网吧电影系统10-26修改版(附教程)
  13. 事实表和维度表的定义
  14. 笔记本装服务器系统 无线网卡无法驱动,笔记本无线驱动,小编教你无线网卡驱动怎么安装...
  15. android自带下拉阻尼动画,Android 阻尼回弹效果简单实现(类似iOS)
  16. 微信小程序实现图片下载功能
  17. 【Day5.6】当地人的美食街
  18. Intel Thunderbolt 3 接口介绍
  19. 使用Boostrap制作导航栏和汉堡按钮
  20. 共享服务器与独立服务器的区别是什么?

热门文章

  1. MYSQL 看书笔记
  2. 设计模式学习—Strategy(策略)
  3. Socket通信原理
  4. iOS 多线程的简单理解(3)执行方式 + 执行对列 的组合
  5. 5-5 表格输出 (5分)
  6. 【安装PHP】如何在openSUSE42.1下编译安装PHP7
  7. 数据库——startup,startup mount,startup nomount有什么区别
  8. nginx php win平台配置
  9. niosII EDS和QuartusII安装心得体会
  10. flv文件转换,完美解决