『Algorithm』守望者的逃离-解题报告

题目描述

Vijos链接-守望者的逃离

恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变。守望者
在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上。为了杀死守望者,尤迪安开始对这
个荒岛施咒,这座岛很快就会沉下去。到那时,岛上的所有人都会遇难。守望者的跑步速度为
17m/s,以这样的速度是无法逃离荒岛的。庆幸的是守望者拥有闪烁法术,可在1s内移动60m,不
过每次使用闪烁法术都会消耗魔法值10点。守望者的魔法值恢复的速度为4点/s,只有处在原地
休息状态时才能恢复。
现在已知守望者的魔法初值M,他所在的初始位置与岛的出口之间的距离S,岛沉没的时间T。
你的任务写写一个程序帮助守望者计算如何在最短的时间内逃离荒岛,若不能逃出,则输出守望
者在剩下的时间能走的最远距离。注意:守望者跑步、闪烁或休息活动均以秒(s)为单位,且每
次活动的持续时间为整数秒。距离的单位为米(m)。

几句闲谈

这几天正在为ACM市赛作准备,突发奇想回到了Vijos刷这道初中就留下了深刻记忆的题目…
好几番挣扎之后终于AC了,普及组的水平对于大二的我来说可能仍然不容易吧
vijos

解题思路

  • 这是一道主要考察贪心的题目(用动态规划思路应该也没问题,但是感觉难很多我也写不出来…)
  • 题目中给的数据其实很精妙,有一点尤其关键:
    20点魔法需要5秒的时间恢复,可以支撑2次闪烁,即花费7秒行进60*2=120米
    而7秒如果全部都在跑步的话,只能行进7*17=119米
  • 119米与120米是解题的关键所在
    可以看到,7秒钟全闪烁和全跑步,相差路程只差了1米,闪烁并不比跑步有悬殊上的优越
    所以必须在足够“安全”的情况下使用闪烁
  • 情况1:如果魔法剩余量为10及以上,不用想太多直接闪烁即可
    情况2:如果魔法剩余量在[6,10]区间,可以原地回魔1秒再闪烁,前提:剩余时间>=2、距离>=34
    情况3:如果魔法剩余量在[2,5]区间,可以原地回魔2秒再闪烁,前提:剩余时间>=3、距离>=51
    情况4:如果魔法剩余量在[0,1]区间,可以…打住!这种情况麻烦很多!这是本题最纠结的地方
    简单地思考可能会选择原地回魔3秒再闪烁。但是这种情况非常造成魔法过剩,之前证明过闪烁并不比跑步有悬殊上的优越,魔法过剩就意味着跑步优于闪烁。
  • 第一第二第三种情况应为足够“安全”,即比跑步肯定是要划算的,所以无需考虑魔法过剩的情况
    试想在某一次逃离中,守望者连续闪烁了若干次,此时离出口很近了,闪烁一次就到了,而逃离状态符合情况4。此时该不该闪烁呢?
    仔细思考一下不难明白,如果这一次抉择是发生在一连串闪烁的最后一次,选择完全跑下去而不是闪烁一次再跑绝对是更明智的。恢复魔法+闪烁需要4秒,3秒内可以行进60米,而这4秒直接跑路的话可以走68米,所以最后一次闪烁抉择,如果正好遇到情况四,那还是果断直接跑路吧
  • 守望者的逃离大致分为两个阶段:
    1. 第一个阶段,因为初始状态中含有一定量的魔法,可以支撑若干次支撑,所以可以连续闪烁。此时注意判断是否在阶段中时间就到了或者出口就到了。
    2. 第二个阶段,恢复一下闪烁一下,如此循环往复,然后在临近出口时选择好开始直接跑路的时机
      这个阶段同样要注意监测好时间是否到了。

AC代码

package com.company;

import java.util.Scanner;

public class Main {

    public static int specialDevide(int num1,int num2) {
        if (num1 % num2 == 0){
            return num1 / num2;
        }else{
            return num1 / num2 + 1;
        }
    }

    public static void print(String s,int num){
        System.out.println(s + "\n" +num);
        System.exit(0);
    }

    public static boolean canBlinkTwice(int timeLimit,int nowMagic,int distance){
        int t = specialDevide(20 - nowMagic , 4);
        int t2 = specialDevide(distance, 60);
        if(t + 2 <= timeLimit && t2 &
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值