华为OD机试真题---孙悟空吃蟠桃

news2024/9/28 9:27:20

题目描述

孙悟空来到了蟠桃园偷吃蟠桃。蟠桃园有N棵桃树,每棵树上都有一定数量的蟠桃。守卫将在H小时后回来。孙悟空每小时可以选择吃一棵树上的所有蟠桃(如果数量少于他选择的速度,则全部吃掉),并且在这一个小时内不会吃其他树上的桃子。孙悟空希望以尽可能慢的速度吃蟠桃,但又要确保在守卫回来之前吃完所有的桃子。题目要求计算孙悟空能在H小时内吃完所有桃子的最小速度K(个/小时),如果以任何速度都吃不完,则返回0。

输入描述

  • 第一行输入为N个数字,表示桃树的数量,接下来是N个数字,用空格分隔,表示每棵桃树上蟠桃的数量。
  • 第二行输入为一个数字H,表示守卫离开的时间(小时)。

输出描述

  • 输出一个整数,表示孙悟空能在H小时内吃完所有桃子的最小速度K。如果以任何速度都吃不完,则输出0。

解题思路

这个问题可以通过二分查找算法来解决。因为速度K与吃完所有桃子所需的时间成反比,即速度越快,所需时间越少,这是一个单调关系。因此,可以通过二分查找找到满足条件的最小速度。

  1. 确定二分查找的初始范围:最小速度可以设为1(即每小时至少吃一个桃子),最大速度可以设为桃树上最多蟠桃的数量。
  2. 二分查找过程
    • 在当前的速度范围内,选择一个中间速度mid。
    • 计算以这个速度吃完所有桃子所需的时间。
    • 如果所需时间小于等于H,说明这个速度或者更小的速度可能在H小时内吃完所有桃子,因此将搜索范围缩小到左半部分(即更小的速度)。
    • 如果所需时间大于H,说明这个速度无法在H小时内吃完所有桃子,因此需要尝试更大的速度,将搜索范围扩大到右半部分。
  3. 结束条件:当搜索范围收敛到一个单独的速度时,该速度即为所求的最小速度K。

示例

输入样例1

2 3 4 5 4 5
5

输出样例1

5

对于样例1,孙悟空以每小时吃5个蟠桃的速度,可以在5小时内吃完所有蟠桃,这是最小的可行速度。

输入样例2

2 3 4 5 3

输出样例2

0

对于样例2,即使孙悟空以最快速度吃桃,也无法在3小时内吃完所有蟠桃,因此输出0。

输入样例3

30 11 23 4 20 6
6

输出样例3

23

对于样例3,孙悟空需要以每小时至少吃23个蟠桃的速度,才能在6小时内吃完所有蟠桃。

代码实现

以java为例,代码实现可以参考以下形式:

import java.util.Scanner;

public class MonkeyEatingPeaches {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 读取桃树数量
        int N = scanner.nextInt();

        // 读取每颗桃树上蟠桃的数量
        int[] peaches = new int[N];
        for (int i = 0; i < N; i++) {
            peaches[i] = scanner.nextInt();
        }

        // 读取守卫离开的时间(小时)
        int H = scanner.nextInt();

        // 调用函数计算最小速度
        int minSpeed = findMinEatingSpeed(peaches, H);

        // 如果存在解决方案,则输出最小速度;否则输出0(理论上不会发生,因为每颗树上都有蟠桃)
        if (minSpeed > 0) {
            System.out.println(minSpeed);
        } else {
            // 在这个特定问题中,由于每颗树上都有蟠桃,且H > 0,因此实际上不会输出0
            // 但为了代码的健壮性,还是保留了这个判断
            System.out.println("No solution possible (theoretically should not happen),0");
        }

        scanner.close();
    }

    /**
     * 寻找最小的吃蟠桃速度
     *
     * @param peaches 整数数组,表示每棵树上的蟠桃数量
     * @param H       整数,表示小时数
     * @return 返回整数,表示最小的吃蟠桃速度
     */
    private static int findMinEatingSpeed(int[] peaches, int H) {
        // 最小速度为1(因为速度不能为0)
        int left = 1;

        // 最大速度初始化为0,稍后在循环中更新
        int right = 0;
        // 遍历所有桃树,确定可能的最大速度
        for (int peach : peaches) {
            // 更新最大速度,确保它至少为树上最多的蟠桃数
            right = Math.max(right, peach);
        }

        // 二分查找合适的吃蟠桃速度
        while (left < right) {
            // 计算中间速度
            int mid = left + (right - left) / 2;
            // 检查以mid速度是否能在H小时内吃完所有蟠桃
            if (canEatAllInHours(peaches, mid, H)) {
                // 如果可以,尝试更小的速度
                right = mid;
            } else {
                // 如果不可以,需要更大的速度
                left = mid + 1;
            }
        }

        // 当left == right时,循环结束,left即为所求的最小速度
        return left;
    }




    /**
     * 判断在有限时间内以给定速度是否能吃完所有桃子
     *
     * @param peaches 桃子数量数组
     * @param speed 吃桃子的速度
     * @param H 可用的总时间(小时)
     * @return 如果在规定时间内可以吃完所有桃子,则返回true;否则返回false
     */
    private static boolean canEatAllInHours(int[] peaches, int speed, int H) {
        // 总时间变量初始化为0
        int totalHours = 0;
        // 遍历桃子数组,计算吃每个桃子所需的时间,并累加到总时间中
        for (int peach : peaches) {
            // 计算吃掉当前桃子所需的时间,使用向上取整的方法确保精度
            totalHours += (peach + speed - 1) / speed;
        }
        // 返回判断结果:如果总时间小于或等于可用时间H,则返回true,表示可以吃完;否则返回false
        return totalHours <= H;
    }

}

运行解析

输入

4
2 3 4 5 
4

输出

5

对于输入4(代表四棵桃树) 2 3 4 5(每棵分别有2、3、4、5个蟠桃)和 4(代表守卫离开的时间为4小时),我们需要计算孙悟空能在4小时内吃完所有蟠桃的最小速度。

让我们来分析一下:

  • 如果速度为1,那么吃完所有蟠桃需要的时间将远远超过4小时。
  • 如果速度为2,时间仍然是太长,因为至少需要 2+2+2+3=9 个时间单位(但每个时间单位只能吃一个,所以实际上需要向上取整)。
  • 如果速度为3,时间仍然不够,因为至少需要 1+1+2+2=6 个时间单位。
  • 如果速度为4,时间还是不够,因为需要 1+1+1+2=5 个时间单位(但第四棵树上的5个蟠桃需要2个时间单位)。
  • 如果速度为5,孙悟空可以在4小时内吃完所有蟠桃:第一棵树需要1小时,第二棵树需要1小时,第三棵树需要1小时,第四棵树需要1小时,总共4小时。

然而,这里有一个重要的点需要注意:在计算所需时间时,我们应该使用“向上取整”的方法,因为孙悟空不能分割蟠桃。例如,如果一棵树上有5个蟠桃,而孙悟空的速度是5,那么他需要1个小时来吃完这些蟠桃(而不是0.5小时或类似的时间)。

基于上述分析,对于输入 2 3 4 54,输出确实应该是 5,因为这是孙悟空能在4小时内吃完所有蟠桃的最小速度。

但是,请注意,如果findMinEatingSpeed方法中的canEatAllInHours函数没有正确实现“向上取整”的逻辑,那么它可能会给出错误的结果。在给出的代码示例中,canEatAllInHours函数已经使用了(peach + speed - 1) / speed来实现向上取整(这是整数除法在Java中的行为,当除不尽时自动向下取整,但通过加speed-1实现了向上取整的效果)。因此,如果输入是2 3 4 54,且使用上述代码,输出应该是5

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

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

相关文章

十进制与ip地址转换公式

1、十进制转为ip地址公式 TEXT(INT(C2/16777216),“0”)&“.”&TEXT(INT((C2-INT(C2/16777216)*16777216)/65536),“0”)&“.”&TEXT(INT((C2-INT(C2/16777216)*16777216-INT((C2-INT(C2/16777216)*16777216)/65536)*65536)/256),“0”)&“.”&TEXT(MO…

SpringBoot的概述与搭建

目录 一.SpringBoot的概述 二.SpringBoot 特点 三.SpringBoot 的核心功能 3.1起步依赖 3.2自动配置 四.SpringBoot 开发环境构建 五.SpringBoot 配置文件 六.SpringBoot数据访问管理 七.springboot注解 八.springboot集成mybatis 九.springboot全局异常捕获与处理 一…

数据集-目标检测系列-豹子 猎豹 检测数据集 leopard>> DataBall

数据集-目标检测系列-豹子 猎豹 检测数据集 leopard>> DataBall 数据集-目标检测系列-豹子 猎豹 检测数据集 leopard 数据量&#xff1a;5k 想要进一步了解&#xff0c;请联系。 DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#x…

C#测试调用FreeSpire.PDFViewer浏览PDF文件

Free Spire.PDFViewer是商业版Spire.PDFViewer的社区版本&#xff0c;支持以控件形式打开并查看PDf文件&#xff0c;但由于是免费版本&#xff0c;存在使用限制&#xff0c;打开的PDF文档只显示前10页内容。如果日常操作的pdf文件都不超过10页&#xff0c;可以考虑使用Free Spi…

我是如何将 Java 基础 docker 镜像大小从 674Mb 优化到 58Mb的

我是如何将 Java 基础 docker 镜像大小从 674Mb 优化到 58Mb的 如果您是 Java 开发人员&#xff0c;并且正在使用 Docker 打包应用程序&#xff0c;您可能已经注意到&#xff0c;即使是“hello world”类型的项目&#xff0c;最终镜像的大小也可能非常大。在本文中&#xff0c…

DAY16||513.找树左下角的值 |路径总和|从中序与后序遍历序列构造二叉树

513.找树左下角的值 题目&#xff1a;513. 找树左下角的值 - 力扣&#xff08;LeetCode&#xff09; 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1示例 2: 输入: […

InternVL 微调实践

任务 follow 教学文档和视频使用QLoRA进行微调模型&#xff0c;复现微调效果&#xff0c;并能成功讲出梗图. 复现过程 参考教程部署&#xff1a;https://github.com/InternLM/Tutorial/blob/camp3/docs/L2/InternVL/joke_readme.md 训练 合并权重&&模型转换 pyth…

多旋翼无人机“仿鸟类”精确拦截飞行目标,助力低空安全

摘要&#xff1a; 使用低成本携带捷联式相机的无人机拦截低空入侵目标是一种具有竞争力的选择。然而&#xff0c;非合作目标的恶意机动和摄像头的耦合使得这项任务充满挑战。为了解决这个问题&#xff0c;提出了一种基于比例导引且具有视场保持能力的基于图像的视觉伺服&#x…

【d52】【Java】【力扣】19.删除链表的倒数第N个节点

思路 1.遍历数组,统计个数&#xff0c;记为total 2.计算出需要被删除的节点 是正数第几个&#xff0c;记做order 3.遍历到order-1,,然后执行删除下一个节点的操作 这里遍历到order-1&#xff0c;是因为想要删除一个节点&#xff0c;需要操作的是它前一个节点的next 代码 /…

JAVA使用Scanner类的nextLint()方法无法正确读取中文。

在练习的时候&#xff0c;我发现我使用Scanner类的nextLint&#xff08;&#xff09;方法无法正确读取到中文了。检查了我的idea编辑器&#xff0c;用的编码格式也是”utf-8“。所以编码格式没有问题。 问题如下棉两张图所示&#xff0c;我输入宝马后&#xff0c;控制台不打印…

助力申报“山东省首台套技术装备”,安畅检测提供第三方检测服务

9月24日&#xff0c;山东省工业和信息化厅发布了《关于组织2024年度山东省首台&#xff08;套&#xff09;技术装备认定工作的通知》。 《通知》中对申报范围、申请条件及申报程序做出了明确规定&#xff0c;并在附件中对申请材料做出了要求。 ★检测报告要求 在《通知》附件…

面试前需要准备什么?

面试前的准备是一个细致且全面的过程&#xff0c;它不仅关乎到你能否在面试中展现出最佳状态&#xff0c;还直接影响到你能否成功获得心仪的职位。以下是一个较为详尽的、接近2000字的面试前准备指南&#xff1a; 一.自我评估与定位 1.深入了解自己 在准备面试之前&#xff…

再谈智慧园区

随着AI的兴起&#xff0c;其影响力将渗透到各行各业。产业园区也不例外。特别是江园科技智慧园区在园区运营上&#xff0c;从早期的信息化&#xff0c;到数字化、智能化&#xff0c;智慧园区是一个不可回避的话题。 01 江园科技智慧园区 无论名称或概念怎么办&#xff0c;产…

Halcon实用系列1-识别二维条码

在做项目时&#xff0c;之前使用的是某康的智能读码器&#xff0c;综合考虑成本&#xff0c;可通过相机拍照来读取图片的二维码&#xff0c;我这边用Halcon来实现。 Halcon代码如下&#xff1a; *创建模型 create_data_code_2d_model(Data Matrix ECC 200, [], [], DataCodeH…

微信小程序map组件自定义气泡真机不显示

最近遇到一个需求需要使用uniapp的map自定义气泡 &#xff0c;做完之后发现在模拟器上好好的&#xff0c;ios真机不显示&#xff0c;安卓页数时好时不好的 一番查询发现是小程序的老问题了&#xff0c;网上的方法都试了也没能解决 后来看到有人说用nvue可以正常显示&#xff0c…

数据结构 ——— 顺序表oj题:编写函数,合并两个有序数组

目录 题目要求 代码实现 题目要求 nums1 和 nums2 是两个升序的整型数组&#xff0c;另外有两个整数 m 和 n 分别代表 nums1 和 nums2 中的元素个数 要求合并 nusm2 到nums1 中&#xff0c;使合并后的 nums1 同样按升序顺序排列 最终&#xff0c;合并后的数组不应由函数返…

基于Hive和Hadoop的招聘分析系统

本项目是一个基于大数据技术的招聘分析系统&#xff0c;旨在为用户提供全面的招聘信息和深入的职位市场分析。系统采用 Hadoop 平台进行大规模数据存储和处理&#xff0c;利用 MapReduce 进行数据分析和处理&#xff0c;通过 Sqoop 实现数据的导入导出&#xff0c;以 Spark 为核…

Text-to-SQL方法研究

1、面临的挑战 自然语言问题往往包含复杂的语言结构,如嵌套语句、倒装句和省略等,很难准确映射到SQL查询上。此外,自然语言本身就存在歧义,一个问题可能有多种解读。消除歧义需要深入的语言理解能力以及融入上下文和领域知识。 要生成正确的SQL查询,文本到SQL系统需要全面理解…

webpack 4 的 30 个步骤构建 react 开发环境

将 react 和 webpack4 进行结合&#xff0c;集 webpack 的优势于一身&#xff0c;从 0 开始构建一个强大的 react 开发环境。 其实很多人都有 一看就会&#xff0c;一做就废 的特点(当然也包括我在内)&#xff0c;这个时候&#xff0c;你需要制定一个略微详细的计划&#xff0…

Redis的基础认识与在ubuntu上的安装教程

来自Redis的自我介绍 我是Redis&#xff0c;一个中间件&#xff0c;职责是把数据存储在内存上&#xff0c;因此可以作为数据库、缓存、消息队列等场景使用。由于可以把数据存储在内存上&#xff0c;因此江湖人称快枪手 1.redis的功能特性 &#xff08;1&#xff09;数据在内存…