华为OD机试 - 爱吃蟠桃的孙悟空 - 二分查找(Python/JS/C/C++ 2024 E卷 100分)

在这里插入图片描述

华为OD机试 2024E卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

孙悟空喜欢吃蟠桃,一天他乘守卫蟠桃园的天兵天将离开了而偷偷的来到王母娘娘的蟠桃园偷吃蟠桃。

已知蟠桃园有 N 棵蟠桃树,第 i 棵蟠桃树上有 N[i](大于 0)个蟠桃,天兵天将将在 H(不小于蟠桃树棵数)小时后回来。

孙悟空可以决定他吃蟠桃的速度 K(单位:个/小时),每个小时他会选择一颗蟠桃树,从中吃掉 K 个蟠桃,如果这棵树上的蟠桃数小于 K,他将吃掉这棵树上所有蟠桃,然后这一小时内不再吃其余蟠桃树上的蟠桃。

孙悟空喜欢慢慢吃,但仍想在天兵天将回来前将所有蟠桃吃完。

求孙悟空可以在 H 小时内吃掉所有蟠桃的最小速度 K(K 为整数)。

二、输入描述

从标准输入中读取一行数字,前面数字表示每棵数上蟠桃个数,最后的数字表示天兵天将将离开的时间。

三、输出描述

吃掉所有蟠桃的 最小速度 K(K 为整数)或 输入异常时输出 -1。

四、测试用例

测试用例1

1、输入

3 11 6 7 8

2、输出

4

3、说明

天兵天将8个小时后回来,孙悟空吃掉所有蟠桃的最小速度4。

  1. 第1小时全部吃完第一棵树,吃3个,
  2. 第2小时吃4个,第二棵树剩7个,
  3. 第3小时吃4个,第二棵树剩3个,
  4. 第4小时吃3个,第二棵树吃完,
  5. 第5小时吃4个,第三棵树剩2个,
  6. 第6小时吃2个,第三棵树吃完,
  7. 第7小时吃4个,第4棵树剩3个,
  8. 第8小时吃3个,第4棵树吃完。

测试用例2

1、输入

1 2 3 4 10

2、输出

1

3、说明

H=10,K=1,可以每小时吃1个蟠桃,10小时吃完所有。

五、解题思路

1、问题分析

题目描述有点复杂,多读几遍不难理解,意思就是:

一个小时只能在一棵桃树上吃,如果吃不完,下一个小时继续吃,如果吃完了,就不吃了,但不能去吃下一颗桃树,要守规矩。

  1. 输入几个数,表示每颗树的桃子数量;
  2. 在H个小时内,以最慢的速度将这些桃子全部吃完。

很明显的回溯问题,一个一个找呗,看哪个速度最合适。

2、具体解题思路

  1. 输入验证:
    • 确保输入不为空,且包含至少一个蟠桃树和一个时间H。
    • 确保所有蟠桃数量和H都是正整数。
    • 确保H大于等于蟠桃树的数量,因为每小时只能吃一棵树。
  2. 算法选择:
    • 二分查找: 采用二分查找在可能的K值范围内寻找最小的可行速度。
    • 左边界为1(最慢速度)。
    • 右边界为最大蟠桃数(最快速度)。
  3. 判断函数 (canEatAll):
    • 对于每棵树,计算吃完该树所需的时间(小时数)。
    • 累加所有树的吃完时间,若总时间小于等于H,则当前速度K可行。
  4. 优化点:在累加过程中,如果时间已超过H,立即返回false,减少不必要的计算。
    • 减少排序操作: 通过遍历找到最大蟠桃数,避免排序带来的额外时间开销。
    • 提前终止: 在判断函数中,当累加时间超过H时,立即返回false。

六、Python算法源码

# 导入所需模块
import math
import sysdef main():try:# 读取输入并分割成整数列表input_line = sys.stdin.readline().strip()if not input_line:print(-1)returntokens = input_line.split()if len(tokens) < 2:print(-1)return# 获取蟠桃树数量和Hpeaches = []for token in tokens[:-1]:num = int(token)if num <= 0:print(-1)returnpeaches.append(num)H = int(tokens[-1])num_trees = len(peaches)if H < num_trees:print(-1)returnmax_peaches = max(peaches)left, right = 1, max_peacheswhile left < right:mid = left + (right - left) // 2if can_eat_all(peaches, H, mid):right = midelse:left = mid + 1print(left)except:print(-1)def can_eat_all(peaches, H, K):times = 0for p in peaches:times += p // Kif p % K != 0:times += 1if times > H:return Falsereturn Trueif __name__ == "__main__":main()

七、JavaScript算法源码

// 读取标准输入
const readline = require('readline');const rl = readline.createInterface({input: process.stdin,output: process.stdout
});function canEatAll(peaches, H, K) {let times = 0;for (let p of peaches) {times += Math.floor(p / K);if (p % K !== 0) {times += 1;}if (times > H) {return false;}}return true;
}rl.on('line', (input) => {try {input = input.trim();if (input === "") {console.log(-1);rl.close();return;}const tokens = input.split(/\s+/);if (tokens.length < 2) {console.log(-1);rl.close();return;}const peaches = [];for (let i = 0; i < tokens.length - 1; i++) {let num = parseInt(tokens[i]);if (isNaN(num) || num <= 0) {console.log(-1);rl.close();return;}peaches.push(num);}const H = parseInt(tokens[tokens.length - 1]);const numTrees = peaches.length;if (isNaN(H) || H < numTrees) {console.log(-1);rl.close();return;}const maxPeaches = Math.max(...peaches);let left = 1;let right = maxPeaches;while (left < right) {let mid = Math.floor((left + right) / 2);if (canEatAll(peaches, H, mid)) {right = mid;} else {left = mid + 1;}}console.log(left);} catch (e) {console.log(-1);}rl.close();
});

八、C算法源码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>// 判断是否可以在H小时内吃完所有蟠桃,速度K
int canEatAll(int *peaches, int numTrees, int H, int K) {int times = 0;for(int i = 0; i < numTrees; i++) {times += peaches[i] / K;if(peaches[i] % K != 0) {times += 1;}if(times > H) {return 0; // false}}return 1; // true
}int main(){char inputLine[1000];if(!fgets(inputLine, sizeof(inputLine), stdin)) {printf("-1\n");return 0;}// 去除末尾换行符inputLine[strcspn(inputLine, "\n")] = 0;// 分割输入char *token = strtok(inputLine, " ");int nums[1000];int count = 0;while(token != NULL){nums[count++] = atoi(token);token = strtok(NULL, " ");}if(count < 2){printf("-1\n");return 0;}int H = nums[count -1];int numTrees = count -1;// 检查所有数是否大于0for(int i =0; i < count; i++) {if(nums[i] <=0 ){printf("-1\n");return 0;}}if(H < numTrees){printf("-1\n");return 0;}// 获取蟠桃数并找到最大值int peaches[numTrees];int maxPeaches = 0;for(int i =0; i < numTrees; i++) {peaches[i] = nums[i];if(peaches[i] > maxPeaches){maxPeaches = peaches[i];}}// 二分查找int left =1, right = maxPeaches, result = maxPeaches;while(left < right){int mid = left + (right - left) /2;if(canEatAll(peaches, numTrees, H, mid)){right = mid;}else{left = mid +1;}}printf("%d\n", left);return 0;
}

九、C++算法源码

#include <bits/stdc++.h>
using namespace std;// 判断是否可以在H小时内吃完所有蟠桃,速度K
bool canEatAll(vector<int> &peaches, int H, int K){int times = 0;for(auto p : peaches){times += p / K;if(p % K != 0){times +=1;}if(times > H){return false;}}return true;
}int main(){string inputLine;if(!getline(cin, inputLine)){cout << "-1" << endl;return 0;}// 分割输入vector<int> nums;int num;stringstream ss(inputLine);while(ss >> num){nums.push_back(num);}if(nums.size() <2){cout << "-1" << endl;return 0;}int H = nums.back();nums.pop_back();int numTrees = nums.size();// 检查所有数是否大于0for(auto p : nums){if(p <=0){cout << "-1" << endl;return 0;}}if(H < numTrees){cout << "-1" << endl;return 0;}// 找到最大值int maxPeaches = *max_element(nums.begin(), nums.end());// 二分查找int left =1, right = maxPeaches;while(left < right){int mid = left + (right - left)/2;if(canEatAll(nums, H, mid)){right = mid;}else{left = mid +1;}}cout << left << endl;return 0;
}

🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)

🏆本文收录于,华为OD机试真题(Python/JS/C/C++)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/56568.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

决策树和集成学习的概念以及部分推导

一、决策树 1、概述 决策树是一种树形结构&#xff0c;树中每个内部节点表示一个特征上的判断&#xff0c;每个分支代表一个判断结果的输出&#xff0c;每个叶子节点代表一种分类结果 决策树的建立过程&#xff1a; 特征选择&#xff1a;选择有较强分类能力的特征决策树生成…

闯关leetcode——110. Balanced Binary Tree

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/balanced-binary-tree/description/ 内容 Given a binary tree, determine if it is height-balanced. A height-balanced binary tree is a binary tree in which the depth of the two subtrees…

决策树算法新手入门:从基础理论到Python实现

决策树新手入门详细教程 一、数学基础1. 信息熵(1) 基本定义(2) 条件熵(3) 有关定律 2. 信息增益 二、决策树的组成1. 决策节点2. 叶子节点3. 决策树的深度 三、决策树的建立&#xff08;基于信息增益&#xff09;—— ID31. 计算根节点的信息熵2. 计算属性的信息增益(1) 职业(…

linux之rm使用技巧

对于包含乱码的文件或目录名&#xff0c;在Linux中删除它们可能会有些棘手&#xff0c;但还是可以通过一些方法来实现。下面是一些处理这种情况的方法&#xff1a; 方法1: 使用通配符 如果这些乱码文件或目录的名字有共同的特征&#xff08;例如都是乱码&#xff09;&#xf…

ModuleNotFoundError: No module named ‘pdfminer.high_level‘

解决办法&#xff1a; pip uninstall pdfminer pip install pdfminer.six 如果还报错&#xff1a;重启计算机 参考资料&#xff1a;https://blog.csdn.net/xigewang_/article/details/132319419

【升华】python基础包NumPy学习

NumPy是使用Python进行科学计算的基础软件包。除其他外&#xff0c;它包括&#xff1a; 功能强大的N维数组对象。精密广播功能函数。集成 C/C和Fortran 代码的工具。强大的线性代数、傅立叶变换和随机数功能。 # 1、安装包 $ pip install numpy# 2、进入python的交互式界面 $…

策略模式-实现方式三

一 枚举类 Getter public enum AuthTypeEnum {QCT_PASSWORD("qct_password", "密码"),MOBILE("mobile", "验证码");public final String code;public final String desc;AuthTypeEnum(String code, String desc) {this.code code;th…

蓄电池在线监测:保障电力安全的智能之选---安科瑞 吴雅芳

一、蓄电池在线监测的重要性 随着科技的飞速发展&#xff0c;蓄电池在各个领域的应用日益广泛&#xff0c;从通信、电力到金融、医疗等行业&#xff0c;蓄电池都扮演着至关重要的角色。然而&#xff0c;蓄电池在使用过程中也面临着诸多问题。 蓄电池老化可能导致鼓胀、短路、漏…

React 子组件调用父组件的方法,以及互相传递数据

<script type"text/babel" data-type"module"> import React, { StrictMode, useState } from react; import { createRoot } from react-dom/client;const ParentComponent () > {const [message, setMessage] useState("")//父组件…

【火山引擎】 Chat实践 | 大模型调用实践 | python

目录 一 前期工作 二 Doubao-pro-4k_test实践 一 前期工作 1 已在火山方舟控制台在线推理页面创建了推理接入点 ,接入大语言模型并获取接入点 ID。 2 已参考安装与初始化中的步骤完成 SDK 安装和访问凭证配置

基于SSM的个性化商铺系统【附源码】

基于SSM的个性化商铺系统 效果如下&#xff1a; 用户登录界面 app首页界面 商品信息界面 店铺信息界面 用户功能界面 我的订单界面 后台登录界面 管理员功能界面 用户管理界面 商家管理界面 店铺信息管理界面 商家功能界面 个人中心界面 研究背景 研究背景 科学技术日新月异…

Java设计模式六大原则

Java设计模式的六大原则是面向对象设计中的基本准则&#xff0c;帮助开发人员构建更灵活、可维护和可扩展的系统。这些原则包括单一职责原则&#xff08;SRP&#xff09;、开闭原则&#xff08;OCP&#xff09;、里氏替换原则&#xff08;LSP&#xff09;、依赖倒置原则&#x…

fiber的原理

React Fiber 的主要原理包括动态优先级、可中断的工作、增量渲染和协作式多任务 React Fiber 是 React 16 引入的一种新的协调&#xff08;reconciliation&#xff09;引擎&#xff0c;它旨在提高 React 应用的性能和响应性。Fiber 的核心原理主要包括以下几个方面&#xff1a…

GitLab 发布安全补丁版本 17.3.2, 17.2.5, 17.1.7

本分分享极狐GitLab 补丁版本 17.4.2, 17.3.5, 17.2.9 的详细内容。这几个版本包含重要的缺陷和安全修复代码&#xff0c;我们强烈建议所有私有化部署用户应该立即升级到上述的某一个版本。对于极狐GitLab SaaS&#xff0c;技术团队已经进行了升级&#xff0c;无需用户采取任何…

常见linux命令及功能汇总

目录 一 系统状态检测命令 PS -AUX TOP pidof kill & killall ifconfig uname uptime free who last history sosreport 二 工作目录切换命令 pwd cd <工作路径> ls 三 文本文件编辑命令 cat more head tail tr wc stat cut …

LeetCode-3191 使二进制数组全部等于1的最少操作次数

又来到了今天的每日一题&#xff0c;距离上次更新每日一题得有十天了。 主要原因是这十天的题要么简单到爆&#xff0c;要么难到爆&#xff0c;再要么就是最近学校安排实训&#xff0c;时间比较紧。 废话不多说&#xff0c;来看看今天的题目。 题目很简单&#xff0c;就是给个…

CTF(五)

导言&#xff1a; 本文主要讲述在CTF竞赛中&#xff0c;web类题目easyphp。 靶场链接&#xff1a;攻防世界 (xctf.org.cn) 参考文章原文链接&#xff1a;Web安全攻防世界05 easyphp&#xff08;江苏工匠杯&#xff09;_攻防世界 easyphp-CSDN博客 一&#xff0c;观察页面。…

校验台账生成网络事业调查表的方法

校验台账生成网络事业调查表的方法 一、打开教育事业统计调查表学校&#xff08;机构&#xff09;信息管理标准化台账“采集信息核查辅助工具二、导入本校台账并校验三、调查表统计导出四、完 一、打开教育事业统计调查表学校&#xff08;机构&#xff09;信息管理标准化台账“…

在ESP-IDF环境中如何进行多文件中的数据流转-FreeRTOS实时操作系统_流缓存区“xMessageBuffer”

一、建立三个源文件和对应的头文件 建立文件名&#xff0c;如图所示 图 1-1 二、包含相应的头文件 main.h 图 2-1 mess_send.h mess_rece.h和这个中类似,不明白的大家看我最后面的源码分享 图2-2 三、声明消息缓存区的句柄 大家注意&#xff0c;在main.c中定义的是全局变…

已发布金融国家标准目录(截止2024年3月)

已发布金融国家标准目录2024年3月序号标准编号标准名称