华为机试题:洞穴逃生
2015-08-06 23:49
288 查看
洞穴逃生
描述:
精灵王子爱好冒险,在一次探险历程中,他进入了一个神秘的山洞。在洞穴深处,精灵王子不小心触动了洞穴内暗藏的机关,整个洞穴将很快塌陷,精灵王子必须尽快逃离洞穴。精灵王子的跑步速度为17m/s,以这样的速度可能是无法逃出洞穴的。庆幸的是精灵王子拥有闪烁法术,可在1s内移动60m,不过每次使用闪烁法术都会消耗魔法值10点。精灵王子的魔法值恢复的速度为4点/s,只有处在原地休息状态时才能恢复。
现在已知精灵王子的魔法初值M,他所在洞穴中的位置与洞穴出口之间的距离S,距离洞穴塌陷的时间T。你的任务是写一个程序帮助精灵王子计算如何在最短的时间内逃离洞穴。若能逃出,输出”Yes”,并输出逃出所用的最短时间;若不能逃出,则输出”No”,同时输出精灵王子在剩下的时间内能走的最远距离。注意字母大小写。注意:精灵王子跑步、闪烁或休息活动均以秒(s)为单位。且每次活动的持续时间为整数秒。距离的单位为米(m)。
注:M、S、T均是大于等于0的整数。由输入保证取值合法性,考生不用检查。
提醒:
如果输入的S为0,则说明本身已经在出口,输出应为:Yes 0
如果输入的T为0(且S不为0),则说明已经没有时间了,输出应为:No 0
运行时间限制: 无限制
内存限制: 无限制
输入:
输入格式:
M
S
T
输出:
输出格式:
Yes 逃出洞穴所用的最短时间
或
No 在洞穴塌陷前能逃跑的最远距离
样例输入:
10
50
5
样例输出:
Yes 1
我的答案(java):
描述:
精灵王子爱好冒险,在一次探险历程中,他进入了一个神秘的山洞。在洞穴深处,精灵王子不小心触动了洞穴内暗藏的机关,整个洞穴将很快塌陷,精灵王子必须尽快逃离洞穴。精灵王子的跑步速度为17m/s,以这样的速度可能是无法逃出洞穴的。庆幸的是精灵王子拥有闪烁法术,可在1s内移动60m,不过每次使用闪烁法术都会消耗魔法值10点。精灵王子的魔法值恢复的速度为4点/s,只有处在原地休息状态时才能恢复。
现在已知精灵王子的魔法初值M,他所在洞穴中的位置与洞穴出口之间的距离S,距离洞穴塌陷的时间T。你的任务是写一个程序帮助精灵王子计算如何在最短的时间内逃离洞穴。若能逃出,输出”Yes”,并输出逃出所用的最短时间;若不能逃出,则输出”No”,同时输出精灵王子在剩下的时间内能走的最远距离。注意字母大小写。注意:精灵王子跑步、闪烁或休息活动均以秒(s)为单位。且每次活动的持续时间为整数秒。距离的单位为米(m)。
注:M、S、T均是大于等于0的整数。由输入保证取值合法性,考生不用检查。
提醒:
如果输入的S为0,则说明本身已经在出口,输出应为:Yes 0
如果输入的T为0(且S不为0),则说明已经没有时间了,输出应为:No 0
运行时间限制: 无限制
内存限制: 无限制
输入:
输入格式:
M
S
T
输出:
输出格式:
Yes 逃出洞穴所用的最短时间
或
No 在洞穴塌陷前能逃跑的最远距离
样例输入:
10
50
5
样例输出:
Yes 1
我的答案(java):
import java.util.Scanner; public class Main{ private int magic=0; private int time=0; private int restDistance=0; private int M=0; private int S=0; private int T=0; private final int SPEED=17; private final int FLASH_SPEED=60; private final int MAGIC_CONSUME=10; private final int MAGIC_RESTORE=4; /** * 输入 * @return */ private void input(){ Scanner sc= new Scanner(System.in); try { M=sc.nextInt(); S=sc.nextInt(); T=sc.nextInt(); } catch (Exception e) { }finally{ sc.close(); } } private void judge(){ if(S==0){ printYes(0); return; } if(T==0){ printNo(0); return; } restDistance=S; magic=M; time=0; while(restDistance>0){ if(time==T){ printNo(S-restDistance); return; } if(magic>=MAGIC_CONSUME){ flash();// 闪烁 }else{ // 判断恢复魔法值需要的时间 int recoveryTime=(int)Math.ceil((double)(MAGIC_CONSUME-magic)/(double)MAGIC_RESTORE); // 只要恢复的时间小于等于2s,都可以选择原地等待,因为花2s恢复魔法,再花1s闪烁,相当于3s跑出60m,如果选择跑步的话,3s只能跑出51m switch (recoveryTime) { case 1: // 原地等待1s,闪烁1s,共耗时2s,如果2s以内能跑出去,或者即使闪烁也跑不出去,本着多跑的原则,就不用原地等待了 // 否则就等待恢复 if(restDistance<=SPEED*2||time+recoveryTime>=T){ run(); }else{ restore(); } break; case 2: // 原地等待2s,闪烁1s,共耗时3s,跑出60m // 如果这3s用来跑步,可以跑出51m // 如果3s能跑出去或者即使闪烁也跑不出去,本着多跑的原则,就不用原地等待了 if(restDistance<=SPEED*3||time+recoveryTime>=T){ run(); }else{ restore(); } break; case 3: default: // 原地等待3s,闪烁1s,共耗时4s,跑出60m // 如果这4s用来跑步,可以跑出68m,所以当等待时间大于等于3s时,只能跑步,等待是不划算的 run(); break; } } time++; } printYes(time); } /** * 跑步 */ private void run(){ restDistance-=SPEED;// 跑步 } /** * 闪烁 */ private void flash(){ restDistance-=FLASH_SPEED;// 闪烁 magic-=MAGIC_CONSUME; } /** * 原地恢复 */ private void restore(){ magic+=MAGIC_RESTORE; } private void printYes(int shortestTime){ System.out.println("YES "+shortestTime); } private void printNo(int longestDistance){ System.out.println("NO "+longestDistance); } public static void main(String[] args){ Main m=new Main(); m.input(); m.judge(); } }
相关文章推荐
- R、ggplot2、shiny 汇总
- Leetcode #104 Maximum Depth of Binary Tree
- 布隆过滤器(Bloom Filter)
- 使用GameMaker中用于碰撞检测的脚本小记
- 第三章 C# 泛型
- sdnuoj1087 过河
- python 2.x和3.x中maketrans和translate函数的使用
- presentationlayer layer modallayer
- 关于安卓集成支付宝的问题jar包冲突
- Linux中iptables学习
- Mybatis中的resultType和resultMap
- 下拉列表框实现二级联动
- IIS7 kindeditor 上传文件一直为上传中请稍后
- Socket相关概念
- 通过代码自定义cell(cell的高度不一致)
- Leetcode解题笔记,basic calculator 1&&basic calculator 2
- 使用CXF开发web service 的服务器端(三)
- 差分方程建模
- cocos2dx 关于lua 绑定的环境配置官方文档翻译与 将自定义c++方法绑定到lua的的方法
- Unity常用插件