2024-01-31:在 GO 中,机器人正在玩一个基于 DOS 的旧游戏,其中有 N+1 座建筑物,编号从 0 到 n,从左到右排列,编号为 0 的建筑物高度为 0 个单位,编号为 I 的建筑物高度为 h(i) 个单位,首先,机器人在编号为 0 的建筑物处, 每走一步,它就会跳到下一个(右边)的建筑物。假设机器人在第 k 栋楼里,它当前的能量值是 e,下一步它会跳到第一个 k+1 楼,它会获得或失去与 h(k+1) 和 e 之差成正比的能量,如果 h(k+1) >e 那么机器人将失去 h(k+1)-e 的能量值, 否则会得到E-H(K+1)的能量值,游戏的目标是到达第N栋楼,在这个过程中,能量值不能是负数单位。
现在的问题是机器人在游戏开始时有多少能量才能保证游戏的成功完成。
从字节。 回答:2024-01-31:
来自左承云。
敏捷 351.首先,根据给定的输入数组将变量 n 初始化为第一个元素的值(即建筑物的数量)。
2.初始化变量 l(左边界)、r(右边界)、max(最大高度)为 0。
3.通过循环 n 次,输入中的建筑物高度按顺序存储在数组 arr 中,r 更新为当前最大高度。
4.初始化变量 m 为 0,ans 为 -1。 这两个变量将用于记录二分类搜索的结果。
5.要执行二进制搜索,当左边界 l 小于或等于右边界 r 时,请执行以下步骤:
5.1.中值 m 的计算公式为 (l + r) 2。
5.2.调用函数 ok(m, max) 判断是否可以以 m 作为能量值完成游戏
5.2.1.在循环中,检查当前能量值 SUM 是否为非负值且不超过最大高度最大值,然后遍历建筑物。
5.2.2.如果总和小于或等于当前建筑高度 arr[i],则机器人会损失 (arr[i] -sum) 能量。
5.2.3.否则,机器人将获得 (sum - arr[i]) 能量。
5.2.4.如果 sum 仍为非负数,则返回 true 表示可以以 m 作为能量值完成游戏,否则返回 false。
5.3.如果 ok(m, max) 返回 true,则将 ans 更新为 m,并将右边框 r 更新为 m-1。
5.4.否则,将左边框 l 更新为 M+1。
6.输出结果ANS,即开始游戏的最低能量值,可以保证游戏的成功完成。
总时间复杂度:o(n log h),其中 n 是建筑物的数量,h 是最大高度。 由于执行了二分搜索,因此当需要在循环内遍历建筑物时,每个判断所需的时间复杂度为 o(n),总时间复杂度为 o(n)。 由于最大高度最大值是在穿越建筑物时计算的,因此总时间复杂度为 o(n log h)。
总附加空间复杂度:o(n),其中 n 是一个常数,数组 arr 是最大值,maxn 是更大的常数。
package mainimport ( "fmt")const maxn = 100001var arr [maxn]intvar n intfunc main() ii := 0 n = inputs[ii] ii++ l := 0 r := 0 max := 0 for i := 0; i < n; i++ m, ans := 0, -1 for l <= r else }fmt.println(ans)}func ok(sum, max int) bool else }return sum >= 0}func max2(a, b int) int return b}
在此处插入说明。
# -*coding:utf-8-*-def ok(sum, max_val): for i in range(n): if sum >= 0 and sum <= max_val: if sum <= arr[i]: sum -= arr[i] -sum else: sum += sum - arr[i] else: break return sum >= 0def max2(a, b): return a if a > b else bmaxn = 100001arr = [0] *maxninputs = [5, 3, 4, 3, 2, 4]ii = 0n = inputs[ii]ii += 1l = 0r = 0max_val = 0for i in range(n): arr[i] = inputs[ii] ii += 1 r = max2(r, arr[i]) max_val = rm, ans = 0, -1while l <= r: m = (l + r) // 2 if ok(m, max_val): ans = m r = m - 1 else: l = m + 1print(ans)
在此处插入说明。