2024-01-31:用go语言,机器人正在玩一个古老的基于DOS的游戏, 游戏中有N+1座建筑,从0到N编号,从左到右排列, 编号为0的建筑高度为0个单位,编号为i的建筑的高度为H(i)个单位, 起
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:
来自左程云。
大体步骤如下:
1.首先,根据给定的输入数组inputs,初始化变量n为第一个元素的值(即建筑数量)。
2.初始化变量l(左边界)、r(右边界)、max(最大高度)为0。
3.通过循环遍历n次,将inputs中的建筑高度依次存储到数组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是否非负且不超过最大高度max,并遍历建筑。
5.2.2.如果sum小于等于当前建筑高度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)。由于最大高度max是在遍历建筑时计算得到的,因此总时间复杂度为O(n log H)。
总的额外空间复杂度:O(N),其中N为常数,数组arr的大小为MAXN,而MAXN为一个较大的常数。
go完整代码如下:
package main
import (
"fmt"
)
const MAXN = 100001
var arr [MAXN]int
var n int
func main() {
inputs := []int{5,
3, 4, 3, 2, 4}
ii := 0
n = inputs[ii]
ii++
l := 0
r := 0
max := 0
for i := 0; i < n; i++ {
arr[i] = inputs[ii]
ii++
r = max2(r, arr[i])
max = r
}
m, ans := 0, -1
for l <= r {
m = (l + r) / 2
if ok(m, max) {
ans = m
r = m - 1
} else {
l = m + 1
}
}
fmt.Println(ans)
}
func ok(sum, max int) bool {
for i := 0; i < n && sum >= 0 && sum <= max; i++ {
if sum <= arr[i] {
sum -= arr[i] - sum
} else {
sum += sum - arr[i]
}
}
return sum >= 0
}
func max2(a, b int) int {
if a > b {
return a
}
return b
}

python完整代码如下:
# -*-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 >= 0
def max2(a, b):
return a if a > b else b
MAXN = 100001
arr = [0] * MAXN
inputs = [5, 3, 4, 3, 2, 4]
ii = 0
n = inputs[ii]
ii += 1
l = 0
r = 0
max_val = 0
for i in range(n):
arr[i] = inputs[ii]
ii += 1
r = max2(r, arr[i])
max_val = r
m, ans = 0, -1
while l <= r:
m = (l + r) // 2
if ok(m, max_val):
ans = m
r = m - 1
else:
l = m + 1
print(ans)

2024-01-31:用go语言,机器人正在玩一个古老的基于DOS的游戏, 游戏中有N+1座建筑,从0到N编号,从左到右排列, 编号为0的建筑高度为0个单位,编号为i的建筑的高度为H(i)个单位, 起的更多相关文章
- SNF快速开发平台3.0之BS页面展示和九大优点-部分页面显示效果-Asp.net+MVC4.0+WebAPI+EasyUI+Knockout
一)经过多年的实践不断优化.精心维护.运行稳定.功能完善: 能经得起不同实施策略下客户的折腾,能满足各种情况下客户的复杂需求. 二)编码实现简单易懂.符合设计模式等理念: 上手快,见效快.方便维护,能 ...
- Flume1.5.0的安装、部署、简单应用(含伪分布式、与hadoop2.2.0、hbase0.96的案例)
目录: 一.什么是Flume? 1)flume的特点 2)flume的可靠性 3)flume的可恢复性 4)flume 的 一些核心概念 二.flume的官方网站在哪里? 三.在哪里下载? 四.如何安 ...
- 参数传递方法(Delphi1.0与win16API使用pascal方法,即从左到右)
参数传递方法李维的InsideVCL<第一章>中提到Windows定义的回调函数typedef LRESULT (CALLBACK*WNDPROC)(HWND,UNIT,WPARAM,LP ...
- poj 1401---求N!末尾0的个数,2的个数一定比5多,观察得来,0的产生即为2*5,去找这个阶乘一行里面5的个数即可
#include<stdio.h> #include<stdlib.h> int main() { int T,N; while(scanf("%d",&a ...
- 设 $y_1(x), y_2(x)$ 是 $y''+p(x)y'+q(x)y=0$ 的两个解 ($p(x), q(x)$ 连续), 且 $y_1(x_0)=y_2(x_0)=0$, $y_1(x)\not\equiv 0$. 试证: $y_1(x)$, $y_2(x)$ 线性相关.
设 $y_1(x), y_2(x)$ 是 $y''+p(x)y'+q(x)y=0$ 的两个解 ($p(x), q(x)$ 连续), 且 $y_1(x_0)=y_2(x_0)=0$, $y_1(x)\n ...
- 解决loadrunner录制时 Request Connection: Remote Server @ 0.0.0.0:80 (Service=?) NOT PROXIED! (REASON: Unable to connect to remote server: rc = -1 , le = 0)问题
环境为win7+ie8+loadrunner11,录制脚本回放查看Recoding log 出现如下错误:[Net An. Error ( 7f8:1340)] Request Connecti ...
- IDE 设备(磁盘/CD-ROM)配置不正确。“ide1:1”上具有一个 IDE 从设备,但没有主设备。此配置在虚拟机中无法正常运行。请使用配置编辑器将磁盘/CD-ROM 从“ide1:1”移到“ide1:0”。
开启vmware报这个错: IDE 设备(磁盘/CD-ROM)配置不正确.“ide1:1”上具有一个 IDE 从设备,但没有主设备.此配置在虚拟机中无法正常运行.请使用配置编辑器将磁盘/CD-ROM ...
- 调用类java.lang.Math的成员方法"public static double random"运算下面表达式10000次,统计其中生成的整数0,1,2,.....20的个数分别是多少,并输出统计结果.(int)(Math.random()*20+0.5)
public class Test2 { public static void main(String args[]){ int num; int count[]=new int[21]; for(i ...
- C++11新特性之0——移动语义、移动构造函数和右值引用
C++引用现在分为左值引用(能取得其地址)和 右值引用(不能取得其地址).其实很好理解,左值引用中的左值一般指的是出现在等号左边的值(带名称的变量,带*号的指针等一类的数据),程序能对这样的左值进行引 ...
- 并发编程概述 委托(delegate) 事件(event) .net core 2.0 event bus 一个简单的基于内存事件总线实现 .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段 基于Ace Admin 的菜单栏实现 第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)
并发编程概述 前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...
随机推荐
- 【每日一题】11.黑白树 (树上DFS)
补题链接:Here 题目描述 一棵 \(n\) 个点的有根树,\(1\) 号点为根,相邻的两个节点之间的距离为 \(1\) .树上每个节点 \(i\)对应一个值\(k[i]\).每个点都有一个颜色,初 ...
- 工作中使用Redis的10种场景
前言 Redis作为一种优秀的基于key/value的缓存,有非常不错的性能和稳定性,无论是在工作中,还是面试中,都经常会出现. 今天这篇文章就跟大家一起聊聊,我在实际工作中使用Redis的10种场景 ...
- JUC包常用类原理
放眼望去,java.util.concurrent包下类大致包括:atomic 原子类.锁.并发集合.线程池.工具类.我们挑重要的了解一下. Atomic 原子类 Java针对并发编程已经有了各种锁, ...
- Linux查看文件内容与处理文件
Linux查看文件内容与处理文件 目录 Linux查看文件内容与处理文件 查看文件内容 1.查看文件类型 2.查看整个文件 3.查看部分文件 处理文件 1.创建空文件 2.过滤文件内容 3.统计文件内 ...
- 04 Tcl字符串
Tcl字符串 4.1 Tcl将说有的变量值视作字符串,并将他们作为字符串进行保存. 命令 描述 append 将值追加到字符串尾 binary 二进制化字符串 format 字符串格式化 regexp ...
- 问题--C++单例模式中唯一对象初始化时关于在类外调用私有的无参构造问题
1.问题 在单例模式中初始化单例对象Person* Person::signal= new Person; 这一步在类外,而new Person需要调用私有的无参构造,但是只有在类内部才能调用私有函数 ...
- [转帖]JVM性能调优工具2之jcmd详解(覆盖全网最全的jcmd命令与说明文档)
上篇文章里<JVM常用性能调优工具详解1>我们已经探究了jps.jstat等监控工具,以及jinfo.jmap.jstack.jhat等故障排查工具,这里我单独拿出一篇文章,特别介绍jcm ...
- [转帖]SQLServer的UTF8支持
排序规则和 Unicode 支持 - SQL Server | Microsoft Learn UTF-8 支持 SQL Server 2019 (15.x) 完全支持广泛使用的 UTF-8 字符编码 ...
- Redis不同版本,内存分配,硬件的性能研究
Redis不同版本,内存分配,硬件的性能研究 前言 Konw more ! Do more ! Gain more ! 骨折之后开始减肥. 前段时间跳绳导致膝盖不舒服,现在改骑车和走路. 在有限的没人 ...
- [转帖]KingbaseES V8R6 中walminer的使用
https://www.cnblogs.com/kingbase/p/17315750.html 前言 walminer工具可以帮助dba挖掘wal日志中的内容,看到某时间对应数据库中的具体操作.例如 ...