AcWing 730. 机器人跳跃问题 (二分)

AcWing 730. 机器人跳跃问题

思路:

  • 由题意可以推出从当前位置跳到下一个位置时,下一个位置的能量值一定为: 2 ∗ E 当 前 − H 下 一 位 置 2*E_{当前}-H_{下一位置} 2EH
  • 由简单的数学归纳可以知道,当 E 0 E_0 E0 满足题意的最小初始能量时,任何大于 E 0 E_0 E0 的初始能量也满足题意,任何小于 E 0 E_0 E0 的初始能量就不再满足题意了
  • 从上面的结论可以看出具有二段性,其中二段性的分界点即为满足题意的最小初始能量 E 0 E_0 E0,因此该题可以用二分法
  • 二段性:左半段的初始E无法让机器人每次跳跃的位置的能量 > 0,右半段的初始E可以让机器人每次跳跃的位置能量 >= 0
  • 分界点:最小的初始E能让机器人每次跳跃的位置能量 >= 0
public class Main {
    int N;
    int[] H;
    Scanner s = new Scanner(System.in);
    
    void run() {
        N = s.nextInt();
        H = new int[N + 1];
        for (int i = 1; i <= N; i++) {
            H[i] = s.nextInt();
       }

        int l = 0, r = 100000;
        while (l < r) {
            
            int mid = (r + l) / 2;
            if (isValid(mid)) r = mid;
            else l = mid + 1;
            
        }
        System.out.println(r);
    }

    boolean isValid(int e) {
        BigInteger bi = new BigInteger(String.valueOf(e));

        for (int i = 1; i < H.length; i++) {
            bi = bi.multiply(new BigInteger(String.valueOf(2)));
            bi = bi.subtract(new BigInteger(String.valueOf(H[i])));
            if (bi.compareTo(new BigInteger(String.valueOf(0))) < 0) return false;
        }
        return true;
    }

    public static void main(String[] args) {
        new Main().run();
    }
}

细节问题:

对于isValid方法,如果直接使用e = 2 * e - H[i]很可能会爆int(long也不行),所以这里使用了大数来处理

优化:

只要初始能量 e >= H[i] 的最大可能高度,由递推式子 2 ∗ E 当 前 − H 下 一 位 置 2*E_{当前}-H_{下一位置} 2EH 可以推出其后续的每次跳跃的位置的能量一定 > 0,所以该条件下就直接return ture,不用再继续递推导致爆int

boolean isValid(int e) {
    for (int i = 1; i < H.length; i++) {
		e = 2 * e - H[i];
		// 如果不加该判断会爆int
		if(e >= 1e5) return true;
        if (e < 0) return false;
    }
    return true;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器人的控制和编程技术是机器人应用的核心技术之一,它直接决定了机器人的智能化程度和任务执行能力。下面我们将对机器人的控制和编程技术做一个简要介绍。 1. 机器人的控制技术 机器人的控制技术包括机器人的运动控制、路径规划、避障等技术。机器人的运动控制是指对机器人的关节或执行器进行精确的控制,以实现机器人的运动和姿态控制。路径规划是指根据机器人的任务需求和环境信息,自主规划机器人的运动路径。避障是指机器人在执行任务时,能够自主避开障碍物,并重新规划路径,以保证任务的完成。 机器人的控制技术通常采用PID控制、模糊控制、遗传算法等方法进行控制和优化。 2. 机器人的编程技术 机器人的编程技术包括机器人的程序设计、控制算法设计、硬件接口设计等。机器人的程序设计是指编写机器人的运动控制算法和任务控制程序,以实现机器人的自主控制和任务执行。控制算法设计是指针对机器人的不同应用场景,设计相应的控制算法,例如路径规划算法、避障算法等。硬件接口设计是指设计机器人的硬件接口,例如传感器接口、执行器接口等。 机器人的编程技术通常采用C/C++、Python等编程语言进行编程,同时也需要掌握机器人操作系统、机器人控制器等相关技术。 总之,机器人的控制和编程技术是机器人应用的核心技术之一,它直接决定了机器人的智能化程度和任务执行能力。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值