网站建设与应用 教案,阿里云网站建设好用吗,西安网络推广外包,wordpress仿百度贴吧机器人搬砖 2025华为OD机试 - 华为OD上机考试 100分题型 华为OD机试真题目录点击查看: 华为OD机试真题题库目录#xff5c;机考题库 算法考点详解
题目描述
机器人搬砖#xff0c;一共有 N 堆砖存放在 N 个不同的仓库中#xff0c;第 i 堆砖中有 bricks[i] 块砖头#…机器人搬砖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个仓库中机器人一个小时内只能在一个仓库搬砖不可能完成任务。题解思路二分首先进行分类讨论能完成和不能完成的情况:题目要求每小时只能处理一个仓库并且只有八个小时工作时间分为以下两种情况仓库数量多余8的肯定不能完成直接输出-1即可。如果仓库数量小于等于8则能完成。接下来像这种在什么限制最少..题型比较经典就是用二分来实现这道题就是二分经典题型二分有个关键就是怎么确定枚举上下边界对于这道题下边界一个仓库由于可以用多个小时来完成所以left可以设置为1上边界right,由于一个时间只能打扫一个仓库所以right可以设置为最大仓库砖块数。接下来就是二分的基本套路,每次枚举mid (left right) /2,如果能够满足条件则更新res mid, 否则设置left mid 1, 直到left right结束。至于检验mid是否可以满足条件的逻辑就是从前往后枚举仓库计算每个仓库需要的小时数(count[i] mid - 1) /mid,累加小时数是否小于等于8c#includeiostream #includevector #includestring #include utility #include sstream #includealgorithm #includecmath #includemap using namespace std; // 通用 切割函数 函数 将字符串str根据delimiter进行切割 vectorint split(const string str, const string delimiter) { vectorint 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(vectorint 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); vectorint 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; }JAVAimport 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); } }Pythonimportsys# 判断在每小时处理 mid 件货物的情况下# 是否能在 8 小时内完成defcheck(counts,mid):hours0forcincounts:# 向上取整hours(cmid-1)//midifhours8:returnFalsereturnTrue# 读取一行输入countslist(map(int,sys.stdin.readline().split()))nlen(counts)# 每小时只能处理一个仓库超过 8 个仓库必定失败ifn8:print(-1)sys.exit(0)left1rightmax(counts)# 二分查找最小可行解whileleftright:mid(leftright)//2ifcheck(counts,mid):rightmidelse:leftmid1print(left)JavaScriptconstreadlinerequire(readline);// readline 接收输入constrlreadline.createInterface({input:process.stdin,output:process.stdout});constlines[];rl.on(line,line{lines.push(line.trim());});rl.on(close,(){constcountslines[0].split(/\s/).map(Number);constncounts.length;// 超过 8 个仓库无法完成if(n8){console.log(-1);return;}letleft1;letrightMath.max(...counts);// 判断函数functioncheck(mid){lethours0;for(constcofcounts){// 向上取整hoursMath.floor((cmid-1)/mid);if(hours8){returnfalse;}}returntrue;}// 二分查找while(leftright){constmid(leftright)1;if(check(mid)){rightmid;}else{leftmid1;}}console.log(left);});Gopackagemainimport(bufiofmtos)// 判断在每小时处理 mid 件货物的情况下// 是否能在 8 小时内完成funccheck(counts[]int,midint)bool{hours:0for_,c:rangecounts{// 向上取整hours(cmid-1)/midifhours8{returnfalse}}returntrue}funcmain(){in:bufio.NewReader(os.Stdin)varcounts[]int// 读取一行所有整数for{varxintif_,err:fmt.Fscan(in,x);err!nil{break}countsappend(counts,x)}n:len(counts)// 每小时只能处理一个仓库超过 8 个仓库直接失败ifn8{fmt.Print(-1)return}left:1right:0// 右边界为最大货物量for_,c:rangecounts{ifcright{rightc}}// 二分查找最小可行解forleftright{mid:(leftright)/2ifcheck(counts,mid){rightmid}else{leftmid1}}fmt.Print(left)}