华为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) 职业(…

【升华】python基础包NumPy学习

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

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

一、蓄电池在线监测的重要性 随着科技的飞速发展&#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首页界面 商品信息界面 店铺信息界面 用户功能界面 我的订单界面 后台登录界面 管理员功能界面 用户管理界面 商家管理界面 店铺信息管理界面 商家功能界面 个人中心界面 研究背景 研究背景 科学技术日新月异…

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中定义的是全局变…

Nodemon 深入解析与使用

目录 1. 基本知识2. Demo3. 高级配置 1. 基本知识 Nodemon 深入解析与使用指南 Nodemon 是一个强大的开发工具&#xff0c;用于监控 Node.js 应用程序中的文件变更&#xff0c;能自动重启应用&#xff0c;极大提高开发效率 基本的优点如下&#xff1a; 自动化&#xff1a;避…

【C语言】循环嵌套:乘法表

循环嵌套&#xff0c;外层循环执行一次&#xff0c;内层循环执行i次。分别控制 在循环的过程中加一层循环。 多层循环属于循环嵌套、嵌套循环 #include <stdio.h> #include <math.h> /* 功能&#xff1a;循环嵌套 乘法表 时间&#xff1a;2024年10月 地点&#xf…

Chrome谷歌浏览器加载ActiveX控件之JT2Go控件

背景 JT2Go是一款西门子公司出品的三维图形轻量化预览解决工具&#xff0c;包含精确3D测量、基本3D剖面、PMI显示和改进的选项过滤器等强大的功能。JT2Go控件是一个标准的ActiveX控件&#xff0c;曾经主要在IE浏览器使用&#xff0c;由于微软禁用IE浏览器&#xff0c;导致JT2Go…

视频画面变糊是平台在做手脚吗?

人气视频博主“影视飓风”一条新发布的视频被全网下架&#xff0c;这两日更是引起轩然大波&#xff0c;不仅频上热门&#xff0c;甚至还有不少数码与视频同行为其抱不平。那么影视飓风到底发布了一条什么视频&#xff1f;又为何会惨被全网下架呢&#xff1f; 10月8日&#xff0…

笔记-static关键字

1.static关键字内存说明 2.访问特点 package com.test.Statics2;import com.test.statics.Student;public class Test {public static void main(String[] args) {// 静态成员中访问非静态成员// method3() // 错误-不能直接调用&#xff0c;需要new对象调用Test test01 new T…

Java 类和对象详解(上 )

个人主页&#xff1a; 鲤鱼王打挺-CSDN博客 Java专栏&#xff1a;https://blog.csdn.net/2401_83779763/category_12801101.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12801101&sharereferPC&sharesource2401_83779763&sharefromfrom_link &…

Vue3的Composition组合式API(computed计算属性、watch监视属性、watchEffect函数)

目录 1. computed计算属性2. watch监视属性2.1 watch监视ref定义的数据2.2 watch监视reactive定义的数据 3. watchEffect函数 1. computed计算属性 与Vue2中的computed配置功能一致。使用示例如下&#xff1a; Student.vue 计算属性的简写只能进行读取&#xff1b;完整写法有…

【vivado】vivado联合modelsim仿真

操作步骤 1 编译Vivado仿真库2 设置仿真工具和库路径3 启动modelsim仿真 1 编译Vivado仿真库 等待编译完成。 2 设置仿真工具和库路径 打开vivado工程文件&#xff0c; 点击tool–>Setting 更改编译器为modelsimulator&#xff0c;并悬着编译库文件 3 启动modelsim仿真…