华为校招笔试:洞穴逃生

题目

原文

精灵王子爱好冒险,在一次探险历程中,他进入了一个神秘的山洞。在洞穴深处,精灵王子不小心触动了洞穴内暗藏的机关,整个洞穴很快塌陷,精灵王子必须晶块逃离洞穴。精灵王子的跑步速度为17m/s,以这样的速度可能是无法逃出洞穴的。庆幸的是精灵王子拥有闪烁法术,可在1s内移动60m,不过每次使用闪烁法术都会消耗魔法值10点。精灵王子的魔法值恢复的速度为4点/s,只有处在原地休息状态时才能恢复。
现在已知精灵王子的魔法初始值M,他所在洞穴中的位置与洞口出口之间的距离S,距离洞穴坍塌的时间T。你的任务是写一个程序帮助精灵王子计算如何在最短的时间内逃离洞穴。若能逃出,输出"Yes",并输出逃出所有的最短时间;若不能逃出,则输出"No",同时输出精灵王子在剩下的时间内能走的最远距离。注意字母大小写。注意:精灵王子跑步、闪烁或休息活动均以秒(s)为单位。且每次活动的持续时间为整数秒。距离的单位(m)。

分析

一眼望过去都是密密麻麻的文字,看着很吓人。没关系,我们把对我们有用的信息提炼出来就好了:

  • 跑步速度:17m/s,闪烁速度:60m/s
  • 闪烁需要消耗10点魔法值,魔法值的恢复速度为4点/s,恢复时需要在原地休息
  • 秒(s)为原子单位,也就是说不存在零点几秒

通过分析我们可以得出:

  • 如果魔法充足,优先使用闪烁
  • 如果魔法不足,则分情况考虑(如下表):
    • 如果距离 >= 60m且 <= 68m,跑步更划算
    • 如果距离 <= 34m,跑步更划算
    • 其他情况则闪烁更划算
      距离=34,60m时,跑步和闪烁是等效的(都能逃出洞口),为了简化问题,统一使用跑步。
魔法值 闪烁 跑步
0、1 (3+1)s - 60m 4s - 68m
2、3、4、5 (2+1)s - 60m 3s - 51m
6、7、8、9 (1+1)s - 60m 2s - 34m
1s - 17m
 使用闪烁需要的时间 = 恢复时间 + 使用时间

参考答案

代码

 import java.util.Scanner;


public class Main {

    public static void main(String[] args) {
        int m, s, t;
        Scanner cin = new Scanner(System.in);
        m = cin.nextInt();
        s = cin.nextInt();
        t = cin.nextInt();
        Main test = new Main();
        test.start(m, s, t);
    }

    public void start(int m, int s, int t) {
        //记录初始距离
        int l = s;
        int second = 0;
        while (s > 0) {
            //如果魔法大于10 就使用魔法
            while (m >= 10) {
                second++;
                if (second > t) {
                    System.out.println("No " + (l - s));
                    return;
                }
                m -= 10;
                s -= 60;
                if (s <= 0) {
                    System.out.println("Yes " + second);
                    return;
                }
            }
            //跑
            if (s >= 60 && s <= 68) {
                second += 4;
                if (second > t) {
                    System.out.println("No " + (l - s));
                    return;
                }
                s -= 17 * 4;
            } else if (s <= 34) {
                second++;
                if (second > t) {
                    System.out.println("No " + (l - s));
                    return;
                }
                s -= 17;
            } else {
                //休息
                int tem = 0;
                while (m < 10) {
                    second++;
                    //尝试跑
                    tem += 17;
                    if (second >= t) {
                        System.out.println("No " + ((l - s) + tem));
                        return;
                    }
                    if (tem > s){
                        System.out.println("Yes " + second);
                        return;
                    }
                    m += 4;
                }
            }
        }
        System.out.println("Yes " + second);
    }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 夏末,在五台山的深山中,有一片少有人踏入的森林。林中的树木遮天蔽日,原本原本炙热的阳关都被树叶挡住,异常的凉爽。林...
    冰月光辉阅读 15,013评论 0 14
  • 本文将天赋点换算成游戏金币来做一个纯粹的价值分析,而这样分析的缺点也非常明显,装备可以有替代品,但天赋点却不占格子...
    月轮阅读 11,778评论 1 10
  • 历来异界小说层出不穷,其中异界也千差万别,有很多侮辱智商的东西是在胡言乱语,甚至自相矛盾,现在,就跟大家分享一下真...
    空白_7阅读 26,155评论 14 43
  • 高野 一个人的一生无论走得再远,都走不出养育他的故乡和村庄。当一个作家或者诗人曾把鲜血和热泪挥洒在那片养育他的热土...
    鹰鹰儿阅读 3,833评论 0 2
  • 对于上学的孩子来说,学习是其第一任务,可除了学习,是否还应该关注一下孩子其它方面呢。 虽然作为父母关注孩子的学习,...
    一生所求8阅读 1,885评论 0 0