news 2026/6/15 14:03:31

华为OD机试(机考) - 机器人搬砖 (C++ Python JAVA JS GO)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
华为OD机试(机考) - 机器人搬砖 (C++ Python JAVA JS GO)

机器人搬砖

2025华为OD机试 - 华为OD上机考试 100分题型

华为OD机试真题目录点击查看: 华为OD机试真题题库目录|机考题库 + 算法考点详解

题目描述

机器人搬砖,一共有 N 堆砖存放在 N 个不同的仓库中,第 i 堆砖中有 bricks[i] 块砖头,要求在 8 小时内搬完。

机器人每小时能搬砖的数量取决于有多少能量格,机器人一个小时中只能在一个仓库中搬砖,机器人的能量格只在这一个小时有效,为使得机器人损耗最小化,应尽量减小每次补充的能量格数。

为了保障在 8 小时内能完成搬砖任务,请计算每小时给机器人充能的最小能量格数。

  • 无需考虑机器人补充能力格的耗时;
  • 无需考虑机器人搬砖的耗时;
  • 机器人每小时补充能量格只在这一个小时中有效;

输入描述

第一行为一行数字,空格分隔

输出描述

机器人每小时最少需要充的能量格,若无法完成任务,输出 -1

用例1

输入

30 12 25 8 19

输出

15

用例2

输入

10 12 25 8 19 8 6 4 17 19 20 30

输出

-1

说明

砖的堆数为12堆存放在12个仓库中,机器人一个小时内只能在一个仓库搬砖,不可能完成任务。

题解

思路:二分

  1. 首先进行分类讨论能完成和不能完成的情况:题目要求每小时只能处理一个仓库并且只有八个小时工作时间,分为以下两种情况
    • 仓库数量多余8的,肯定不能完成,直接输出-1即可。
    • 如果仓库数量小于等于8,则能完成。
  2. 接下来像这种在什么限制最少..题型,比较经典就是用二分来实现,这道题就是二分经典题型,二分有个关键就是怎么确定枚举上下边界,对于这道题下边界一个仓库由于可以用多个小时来完成,所以left可以设置为1,上边界right,由于一个时间只能打扫一个仓库,所以right可以设置为最大仓库砖块数
  3. 接下来就是二分的基本套路,每次枚举mid = (left + right) /2,如果能够满足条件则更新res = mid, 否则设置left = mid + 1, 直到left == right结束。
  4. 至于检验mid是否可以满足条件的逻辑,就是从前往后枚举仓库,计算每个仓库需要的小时数(count[i] + mid - 1) /mid,累加小时数是否小于等于8

c++

#include<iostream> #include<vector> #include<string> #include <utility> #include <sstream> #include<algorithm> #include<cmath> #include<map> using namespace std; // 通用 切割函数 函数 将字符串str根据delimiter进行切割 vector<int> split(const string& str, const string& delimiter) { vector<int> result; size_t start = 0; size_t end = str.find(delimiter); while (end != string::npos) { result.push_back(stoi(str.substr(start, end - start))); start = end + delimiter.length(); end = str.find(delimiter, start); } // 添加最后一个部分 result.push_back(stoi(str.substr(start))); return result; } bool check(vector<int>& count, int mid) { int hours = 0; for (int i = 0; i < count.size(); i++) { // 每个仓需要时间 hours += (count[i] + mid - 1) / mid; if (hours > 8){ return false; } } return hours <= 8; } int main() { string input; getline(cin, input); vector<int> counts = split(input, " "); int n = counts.size(); // 每小时只能处理一个仓库,超过8小时肯定不能完成 if (n > 8) { cout << -1; return 0; } int left = 1; // 右边界设置为最大数量 int right = 0; for (int i = 0; i < n; i++) { right = max(right, counts[i]); } // 二分 while (left < right) { int mid = (left + right) >> 1; if (check(counts, mid)) { right = mid; } else { left = mid + 1; } } cout << left; return 0; }

JAVA

import java.io.*; import java.util.*; public class Main { // 判断在每小时处理 mid 件货物的情况下,是否能在 8 小时内完成 static boolean check(int[] counts, int mid) { int hours = 0; for (int c : counts) { // 向上取整:(c + mid - 1) / mid hours += (c + mid - 1) / mid; if (hours > 8) { return false; } } return true; } public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String line = br.readLine(); String[] parts = line.split(" "); int n = parts.length; int[] counts = new int[n]; for (int i = 0; i < n; i++) { counts[i] = Integer.parseInt(parts[i]); } // 每小时只能处理一个仓库,超过 8 个仓库必定失败 if (n > 8) { System.out.print(-1); return; } int left = 1; int right = 0; // 右边界为最大货物量 for (int c : counts) { right = Math.max(right, c); } // 二分查找最小可行解 while (left < right) { int mid = (left + right) >> 1; if (check(counts, mid)) { right = mid; } else { left = mid + 1; } } System.out.print(left); } }

Python

importsys# 判断在每小时处理 mid 件货物的情况下# 是否能在 8 小时内完成defcheck(counts,mid):hours=0forcincounts:# 向上取整hours+=(c+mid-1)//midifhours>8:returnFalsereturnTrue# 读取一行输入counts=list(map(int,sys.stdin.readline().split()))n=len(counts)# 每小时只能处理一个仓库,超过 8 个仓库必定失败ifn>8:print(-1)sys.exit(0)left=1right=max(counts)# 二分查找最小可行解whileleft<right:mid=(left+right)//2ifcheck(counts,mid):right=midelse:left=mid+1print(left)

JavaScript

constreadline=require('readline');// readline 接收输入constrl=readline.createInterface({input:process.stdin,output:process.stdout});constlines=[];rl.on('line',line=>{lines.push(line.trim());});rl.on('close',()=>{constcounts=lines[0].split(/\s+/).map(Number);constn=counts.length;// 超过 8 个仓库无法完成if(n>8){console.log(-1);return;}letleft=1;letright=Math.max(...counts);// 判断函数functioncheck(mid){lethours=0;for(constcofcounts){// 向上取整hours+=Math.floor((c+mid-1)/mid);if(hours>8){returnfalse;}}returntrue;}// 二分查找while(left<right){constmid=(left+right)>>1;if(check(mid)){right=mid;}else{left=mid+1;}}console.log(left);});

Go

packagemainimport("bufio""fmt""os")// 判断在每小时处理 mid 件货物的情况下// 是否能在 8 小时内完成funccheck(counts[]int,midint)bool{hours:=0for_,c:=rangecounts{// 向上取整hours+=(c+mid-1)/midifhours>8{returnfalse}}returntrue}funcmain(){in:=bufio.NewReader(os.Stdin)varcounts[]int// 读取一行所有整数for{varxintif_,err:=fmt.Fscan(in,&x);err!=nil{break}counts=append(counts,x)}n:=len(counts)// 每小时只能处理一个仓库,超过 8 个仓库直接失败ifn>8{fmt.Print(-1)return}left:=1right:=0// 右边界为最大货物量for_,c:=rangecounts{ifc>right{right=c}}// 二分查找最小可行解forleft<right{mid:=(left+right)/2ifcheck(counts,mid){right=mid}else{left=mid+1}}fmt.Print(left)}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/13 15:51:06

货币汇率换算免费API接口(每日更新汇率)

接口概述 货币汇率换算API是由接口盒子免费API提供的一项免费服务接口&#xff0c;能够实现全球多种货币之间的汇率换算功能。该接口每日更新汇率数据&#xff0c;为开发者提供便捷的货币换算解决方案。 接口特点 免费使用&#xff1a;基础功能完全免费 每日更新&#xff1a…

作者头像 李华
网站建设 2026/6/12 10:27:09

投稿?别怕!宏智树AI的期刊“外挂”功能,给学术新手的进阶指南

01 期刊发表迷局&#xff1a;天梯下的研究者困境 每一位希望发表期刊论文的研究者&#xff0c;都面临着看似简单实则复杂的三重考验&#xff1a; 第一关&#xff1a;框架与创新迷思。如何构思一个既符合期刊调性&#xff0c;又具备足够创新性的研究框架&#xff1f;许多研究者…

作者头像 李华
网站建设 2026/6/15 4:10:14

希尔排序--自学笔记

希尔排序 学习目标&#xff1a; 一.希尔排序的思想 二.增量序列 三.复杂度分析 四.希尔排序为什么快&#xff1f; 五.强化练习 一.希尔排序的思想 1.将待排序数组按照一定的“间隔”分为多个子数组&#xff0c; 每组分别进行“插入排序” 2.逐渐缩小间隔&#xff0c;…

作者头像 李华
网站建设 2026/6/11 9:02:32

前端开发规范实践

文档总结了前端开发团队在代码规范、质量控制、版本管理和开发流程等方面的一些实践&#xff0c;旨在帮助团队建立统一的开发标准&#xff0c;提高代码质量和开发效率。1. 前端编码规范管理1.1 统一编码规范1.1.1 命名规范变量命名&#xff1a;使用小驼峰命名法&#xff08;cam…

作者头像 李华
网站建设 2026/6/14 16:30:47

通达信支撑线

{}GUOQI:DATE>1110101; BAOLIU:DAY>24 AND DAY<30 AND FRACPART(MONTH/2)0.5; WUXIAO:GUOQI1 AND BAOLIU1; 五分:5; 十五分:五分*3; 三十分:十五分*2; 六十分:三十分*2; 日:六十分*4; 周:日*5; 月:周*4; 季:月*3; 半年:季*2; 年:半年*2; A:(OPENHIGHLOWCLOSECLOSE)/5;…

作者头像 李华
网站建设 2026/6/14 5:33:10

通达信周均线 源码

{}TYP:(HIGHLOWCLOSE)/3; CCI:(TYP-MA(TYP,14))/(0.015*AVEDEV(TYP,14)); 陡峭度:CCI-REF(CCI,1)/1;{} RSV:(CLOSE-LLV(LOW,9))/(HHV(HIGH,9)-LLV(LOW,9))*100; K:SMA(RSV,3,1); D:SMA(K,3,1); J:3*K-2*D; REF(CCI,1)<50 AND CCI>50 AND CCI<100 AND 陡峭度>N AND …

作者头像 李华