普及练习场 BOSS战-普及综合练习2 守望者的逃离

题目链接:https://www.luogu.org/problemnew/show/P1095

题意理解

这题其实最近做过一条差不多的,吃鸡跑毒那条。但是还是不一样。

由于考虑的是最短时间和最长路程,根据数字的大小来看,表示每一时刻能跑的最长路程,应该是最靠谱的,并且也符合题目要求。

那么如何表示每个时刻能跑的最长路程呢?可以考虑暴力搜索,但是看看这个T大小,好像不是很好做。

第一步应该想到,一开始是全部都是闪烁。然后算一下,使用闪烁加休息的方法,可以做到3.5s跑60米。这个速度是优于跑步的。因此在后面可以休息到可以闪烁一次,就闪烁。但是由于考虑的是每个时刻能跑的最大距离,因此有可能有时候就需要把休息变成跑步。但是这个不会影响到后继的状态,因为休息加闪烁的距离,是在一开始求出来的。

代码

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    static int M, S, T;
    static int[] dp;
    public static void main(String[] args) {
        FastScanner fs = new FastScanner();
        M = fs.nextInt();
        S = fs.nextInt();
        T = fs.nextInt();
        dp = new int[T + 5];
        for(int i = 1; i <= T; i++) {
            if(M >= 10) {
                dp[i] = dp[i-1] + 60;
                M -= 10;
            } else {
                dp[i] = dp[i-1];
                M += 4;
            }
        }
        for(int i = 1; i <= T; i++) {
            dp[i] = Math.max(dp[i-1] + 17, dp[i]);
            if(dp[i] >= S) {
                System.out.println("Yes");
                System.out.println(i);
                return;
            }
        }
        System.out.println("No");
        System.out.println(dp[T]);
    }

    public static class FastScanner {
        private BufferedReader br;
        private StringTokenizer st;

        public void eat(String s) {
            st = new StringTokenizer(s);
        }

        public FastScanner() {
            br = new BufferedReader(new InputStreamReader(System.in));
            eat("");
        }

        public String nextLine() {
            try {
                return br.readLine();
            } catch (Exception e) {
                // TODO: handle exception
            }
            return null;
        }

        public boolean hasNext() {
            while(!st.hasMoreTokens()) {
                String s = nextLine();
                if(s == null) {
                    return false;
                }
                eat(s);
            }
            return true;
        }

        public String nextToken() {
            hasNext();
            return st.nextToken();
        }

        public int nextInt() {
            return Integer.valueOf(nextToken());
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值