2024 01:31 在围棋中,机器人正在玩一个基于DOS的旧游戏

小夏 科技 更新 2024-02-01

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)

在此处插入说明。

相似文章

    Go 语法 Sugar 探索 Go 便捷的语法和简洁的写作

    一 引言。GO语言作为一种现代编程语言,具有简洁 清晰 高效的语法。go 语言提供了一些语法糖和简洁的写作,使 更简洁易读。本文将介绍 Go 语言中的一些句法糖和简洁的写作方法,例如多重赋值 空白标识符 短变量声明等。.多次分配。在 go 中,可以使用多个赋值来同时为多个变量赋值。例如 goa,b ...

    揭开围棋语言常见错误的神秘面纱 100个避免掉坑的经典案例!

    ...

    肖欣分享了GO语言初学者应该掌握哪些知识

    分享兴趣,传播快乐,增长知识,留下美好的未来。亲爱的你,这里是LearningYard!今天给大家带来一个GO语言的初学者介绍,欢迎大家用心参观!share interest,spread happiness,increase knowledge,le e beautiful.dear you,th...

    如何在 C 语言中使用时间函数

    C 语言中的时间函数是用于获取当前时间的函数。它是在头文件中定义的,因此需要先包含它,然后才能使用。时间函数的原型如下 ctime t time time t tloc 其中 time t 是表示时间的类型,tloc 是指向类型 time t 的指针,用于存储获取的当前时间。如果 TLOC 为 nu...

    如何在 C 语言中使用 abs 函数

    在 C 语言中,ABS 和 FABS 函数用于计算整数和浮点值的绝对值。这两个函数在数学和工程领域非常有用,可以帮助我们处理各种数值问题。首先,我们来看看abs的功能。abs 函数用于计算整数的绝对值。它的函数原型是 int abs int n 其中参数 n 是一个整数。如果 n 为正数,则函数返回...