Acwing---730.机器人问题

1.题目

机器人正在玩一个古老的基于 DOS 的游戏。

游戏中有 N+1 座建筑——从 0 到 N 编号,从左到右排列。

编号为 0 的建筑高度为 0 个单位,编号为 i 的建筑高度为 H(i) 个单位。

起初,机器人在编号为 0 的建筑处。

每一步,它跳到下一个(右边)建筑。

假设机器人在第 k 个建筑,且它现在的能量值是 E,下一步它将跳到第 k+1 个建筑。

如果 H(k+1)>E,那么机器人就失去 H(k+1)−E 的能量值,否则它将得到 E−H(k+1) 的能量值。

游戏目标是到达第 N 个建筑,在这个过程中能量值不能为负数个单位。

现在的问题是机器人至少以多少能量值开始游戏,才可以保证成功完成游戏?
在这里插入图片描述

2.基本思想

二分

H (k+1) >E 即 E -( H(k+1) − E
H (k+1)<=E 即 E +( E − H(k+1)

化简 两种情况即 2E - H(k+1)

对于
在这里插入图片描述

3.代码实现

import java.io.*;

public class _730机器人问题 {
    static int N = 100010;
    static int n;
    static int h[] = new int[N];

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n=Integer.parseInt(br.readLine());
        String s[] =br.readLine().split(" ");
        for (int i = 1; i <= n; i++)
            h[i] =Integer.parseInt(s[i-1]);

        //二分
        int l = 0, r = N;
        while (l < r) {
            int mid = l + r >> 1;
            if (check(mid)) r = mid;
            else l = mid + 1;
        }
        System.out.println(l);
    }

    //校验 传入能量为mid是否符合
    private static boolean check(int e) {
        //遍历每个建筑 是否符合 任意时刻 e>0 、 2*e-h > 0
        for (int i = 1; i <= n; i++) {
            e = 2 * e - h[i];
            if (e >= N) return true;
            if (e < 0) return false;
        }
        return true;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

amant 柒少

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值