猴子吃桃:玩转二分思维

零基础用Raptor玩转数组:从字符统计到矩阵求和的6个必练项目 本文为零基础学习者提供了6个使用Raptor掌握数组核心操作的实战项目。从字符统计、星期判断到矩阵求和与图形打印,通过具体案例详解一维和二维数组的遍历、存储与算法应用,帮助读者直观理解数据结构,避开常见错误,快速提升编程逻辑与问题解决能力。 阅读详情

前言

在计算机编程领域,算法是解决问题的有效途径之一。而算法题则是考察程序员解决问题能力的重要手段之一。在这篇文章中,我们将通过一个经典的算法题目——猴子吃桃,来探讨算法思维的重要性以及解题的方法。

题目描述

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

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

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

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

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

输入描述:

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

输出描述:

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

示例 1:

输入:

3 11 6 7 
8

输出:

4

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

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


题目分析

这道题目是一个典型的搜索问题,需要我们找到一个最小的速度 K,使得孙悟空能在规定的时间内吃掉所有的蟠桃。

原题为:875. 爱吃香蕉的珂珂
https://leetcode.cn/problems/koko-eating-bananas/description/

解题思路

我们可以通过二分查找的方式来确定孙悟空吃蟠桃的速度 K。首先,我们需要确定二分查找的搜索范围,最小速度 K 的下界是 1,最大速度 K 的上界是所有蟠桃中的最大数量。

对于每一个速度 K,我们可以计算出孙悟空吃完所有蟠桃需要的时间,然后将这个时间与规定的时间 H 进行比较。

  • 如果孙悟空需要的时间小于等于规定的时间,说明速度 K 可行,我们就可以将速度 K 的上界缩小;
  • 如果孙悟空需要的时间大于规定的时间,说明速度 K 不够快,我们就需要将速度 K 的下界增大。

代码实现

from typing import List
from loguru import logger


class Solution:
    def min_eating_speed(self, coiled_peach: List[int], h: int) -> int:
        if not coiled_peach or h < len(coiled_peach):
            return -1

        # 二分查找速度 K 的上界和下界
        left, right = 1, max(coiled_peach)
        while left < right:
            mid = (left + right) // 2
            if self.can_eat_all(coiled_peach, h, mid):
                right = mid
            else:
                left = mid + 1
        return left

    def can_eat_all(self, coiled_peach, h, K):
        """
        判断孙悟空在给定速度 K 的情况下是否能在规定时间 h 内吃完所有的蟠桃。

        Args:
            coiled_peach (list): 每棵蟠桃树上的蟠桃数量列表。
            h (int): 天兵天将回来的时间。
            K (int): 孙悟空吃蟠桃的速度。

        Returns:
            bool: 如果能在规定时间内吃完所有蟠桃,则返回 True,否则返回 False。
        """
        total_time = sum((num + K - 1) // K for num in coiled_peach)  # 记录吃完所有桃树的时间
        return total_time <= h


if __name__ == "__main__":
    s_instance = Solution()

    min_speed = s_instance.min_eating_speed(coiled_peach=[3, 11, 6, 7], h=8)
    logger.info(f"get min speed: {min_speed}")

    min_speed = s_instance.min_eating_speed(coiled_peach=[2, 3, 4, 5], h=3)
    logger.info(f"get min speed: {min_speed}")

    min_speed = s_instance.min_eating_speed(coiled_peach=[2, 3, 4, 5], h=4)
    logger.info(f"get min speed: {min_speed}")

    min_speed = s_instance.min_eating_speed(coiled_peach=[30, 11, 23, 4, 20], h=6)
    logger.info(f"get min speed: {min_speed}")

    min_speed = s_instance.min_eating_speed(coiled_peach=[30, 11, 23, 4, 20], h=5)
    logger.info(f"get min speed: {min_speed}")

输出结果为:

总结

通过二分查找的方法,我们可以高效地找到孙悟空吃蟠桃的最小速度 K。这种解题思路可以应用于类似的搜索问题,能够在保证时间效率的情况下得到正确的结果。

【华为OD】C卷200分真题:100%通过 孙悟空吃蟠桃 C/C++实现 【思路+源码】 孙悟空爱吃蟠桃,有一天趁着蟠桃园守卫不在来偷吃。已知蟠桃园有N颗桃树,每颗树上都有桃子,守卫将在H小时后回来。孙悟空可以决定他吃蟠桃的速度K(个/小时),每个小时选一颗桃树,并从树上吃掉K个,如果树上的桃子少于K个,则全部吃掉,并且这一小时剩余的时间里不再吃桃。孙悟空喜欢慢慢吃,但又想在守卫回来前吃完桃子。请返回孙悟空可以在H小时内吃掉所有桃子的最小速度K(K为整数)。如果以任何速度都吃不完所有桃子,则返回0 阅读详情

相关推荐

爱吃蟠桃的孙悟空

考察:二分法

优快云 1万+

猴子吃桃算法

1.算法描述: 猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾就多吃了一个。第二天早上又将剩下的桃子吃了一半,还是不过瘾又多吃了一个。以后每天都吃前一天剩下的一半再加一个。到第10天刚好剩一个。问猴子第一天摘了多少个桃子? 2.分析这是一个很经典的递归算法,只要找到递归公式就迎刃而解 第n天桃子总数 - (第n天桃子总数/2 + 1) = 第n+1天桃子总数 S1 = 2(S2 + 1) S2

yuqing_1102的专栏 1751

【华为OD机试真题 Python】孙悟空吃蟠桃|解题思路、代码解析

如果总和不超过h,就找到了符合条件的最小值,跳出循环并输出结果。如果总和超过h,继续增加除数,直到找到符合条件的最小值。孙悟空可以决定他吃蟠桃的速度K(个/小时),每个小时选一颗桃树,并从树上吃掉K个,如果树上的桃子少于K个,则全部吃掉,并且这一小时剩余的时间里不再吃桃。已知蟠桃园有N颗桃树,每颗树上都有桃子,守卫将在H小时后回来。其中数字通过空格分割,N、H为正整数,每棵树上都有蟠桃,且0

yegu001的博客 828

简单的java编程问题(猴子吃桃)

猴子吃桃问题: 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。 public class HouZiChiTao { public static void main(String[] args) { //题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个

If_are_you的博客 470

华为机试真题实战应用【赛题代码篇】-猴子吃桃(附Java、C++和python代码)

孙悟空喜欢吃蟠桃,一天他乘守卫蟠桃园的天兵天将离开了而偷偷的来到王母娘娘的蟠桃园偷吃蟠桃。已知蟠桃园有 N 棵蟠桃树,第 i 棵蟠桃树上有 N[i](大于 0)个蟠桃,天兵天将将在 H(不小于蟠桃树棵数)小时后回来。孙悟空可以决定他吃蟠桃的速度 K(单位:个/小时),每个小时他会选择一颗蟠桃树,从中吃掉 K 个蟠桃,如果这棵树上的蟠桃数小于 K,他将吃掉这棵树上所有蟠桃,然后这一小时内不再吃其余蟠桃树上的蟠桃。孙悟空喜欢慢慢吃,但仍想在天兵天将回来前将所有蟠桃吃完。

qq_36130719的博客 740

【2023版】基于JT808/JT1078协议的车载视频监控平台开发实战-开源架构解析

本文详细解析了基于JT808/JT1078协议的车载视频监控平台开发实战,涵盖协议核心作用、开源架构设计、开发避坑指南及二次开发建议。重点介绍了JT1078协议在音视频传输中的优化方案,以及海量位置数据存储、高可用架构等关键技术点,为开发者提供全面的实战参考。

weixin_26965807的博客 233

杭电网安复试C语言上机题保姆级攻略:从猴子吃桃到希尔排序,手把手带你通关

本文提供杭电网安复试C语言上机题的全面攻略,涵盖排序算法、数学逻辑题、字符串处理等六大核心模块。通过详细的代码示例和调试技巧,帮助考生快速掌握解题思维,优化考场时间分配,提升复试通过率。特别适合准备杭电网安复试的考生参考。

weixin_30367169的博客 261

第18届全国大学生智能汽车竞赛四轮车开源讲解【2.5】-- 图像处理实战:从二值化到边缘检测的工程优化

本文深入讲解了第18届全国大学生智能汽车竞赛四轮车开源项目中图像处理的核心实战技术。文章聚焦于二值化与边缘检测两大关键环节,详细对比了大津法与索贝尔算子的工程应用与优化策略,并分享了遮光、偏振片等物理抗干扰技巧,旨在帮助参赛者构建稳定高效的图像预处理流水线,为赛道识别奠定坚实基础。

weixin_29279047的博客 100

蓝桥杯--算法提高 P0402(java)

资源限制 时间限制:1.0s 内存限制:256.0MB   猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第十天早上想在吃时就只剩下一个桃子了。求第一天共摘了多少桃子。   (下面的不是正确答案) 输出:   8 ————————————————————————————————————...

QinLaoDeMaChu的博客 225

先进封装技术的一些优缺点探讨

半导体封装技术是半导体制造过程中的关键环节,它不仅保护了芯片免受物理损伤,还提供了电气连接和散热功能。随着技术的发展,出现了多种先进的封装技术,每种技术都有其特定的应用场景和优缺点。

阿拉伯梳子的专栏 2168

igh ethercat 实时性测试

组备注std(us)max(us)a无锁核,无rt补丁8.38108b锁核+FIFO调度+内存锁定,无rt补丁0.9216c锁核+FIFO调度+内存锁定,+rt补丁0.9922可以看到 a组 使用ethercat不做其他优化,周期抖动非常大,且max能达到 100 多 us;通过 锁核+FIFO调度+内存锁定 进行优化,可以看到 抖动明显降低,且max 为 20 us 左右;

qq_43353632的博客 2309

【二叉树、二分】小猴子下落

题目描述 有一颗二叉树,最大深度为D,且所有叶子的深度都相同。所有结点从左到右从上到下的编号为1,2,3,·····,2的D次方减1。在结点1处放一个小猴子,它会往下跑。每个内结点上都有一个开关,初始全部关闭,当每次有小猴子跑到一个开关上时,它的状态都会改变,当到达一个内结点时,如果开关关闭,小猴子往左走,否则往右走,直到走到叶子结点。一些小猴子从结点1处开始往下跑,最后一个小猴儿会跑...

weixin_30608131的博客 183

lumerical中DEVICE和MODE模块的交互使用(真的很干货!!可以自信的说网上绝对找不到比我更详细的步骤了)

几个脚本文件很重要! Lumerical仿真流程: 一、DEVICE: (1).建模并且运行完之后,在脚本提示符下键入以下脚本行以运行plotDopingProfile.lsf如图1(文件名如果索引不到的话就可以把文件直接用notepad++打开,然后把代码直接输入到device中script脚本中 如图2)脚本文件并生成下图 如图3: (图2) (图1) (图3) (2).仿真...

1万+

第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-246 算法训练 猴子吃包子

第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-246 算法训练 猴子吃包子 前言 猴子吃包子 C语言 C++语言 Java语言 Python语言 总结 第六届——第十三届省赛题解 第六届——第十二届国赛题解

红目香薰 219

ShardingSphere-jdbc 5.5.0 + spring boot 基础配置 - 实战篇

shardingsphere 5.5.0移除了sm4算法,自己加上即可。增加spi扩展org.apache.shardingsphere.encrypt.spi.EncryptAlgorithm增加以下代码:SM4算法代码/***/static {@Getter@Overrideif (!

qq_21903999的博客 4741

UWB 多传感器通信的纳秒无线位置和时钟同步方法

利用UWB高精度的特点,实现多节点下的无线时钟同步和定位。通过优化硬件架构,减少不确定延迟的影响,系统可以提供纳秒级时钟同步消息

DT程序员的博客 1324

python编写一个数学小问题

1.有一只小猴子,摘了很多桃,第一天吃了一半,感觉没吃饱,又吃了一个 第二天又吃了剩下的一半,没吃饱,又吃了一个,第三天又吃了剩下的一半,没吃饱 又吃了一个,以此类推,到了第10`天发现,只剩下一个了,请问第一天一共摘了多少桃 n = 1 for i in range(10): n = (n+1) * 2 print(n) ...

m0_46183436的博客 321

windows下玩转vllm:在wsl下安装vllm

当前,部署通义千问2.5-vl已经是一件箭在弦上,不得不发的事儿了。网上搜了一下,发现还是用vllm用的比较多。于是乎,这就开始尝试部署vllm。但是我们之前说了,vllm是不支持直接在windows上部署的,我们还得搞wsl或者docker。咱今天先尝试使用wsl进行安装哈。

xiezhipu的博客 4135

算法思维训练:用C语言解构生活中的10个经典问题

本文通过C语言解析10个经典生活问题,如百钱买百鸡、斐波那契数列等,培养算法思维。涵盖穷举法、递归、逆向思维等核心算法技巧,帮助读者掌握资源分配、高效检索等实用技能,提升编程与问题解决能力。

weixin_29018815的博客 543

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

杭电网安复试C语言上机题保姆级攻略:从猴子吃桃到希尔排序,手把手带你搞定

本文提供杭电网安复试C语言上机题的全面攻略,涵盖从猴子吃桃到希尔排序的各类题型解析与实战技巧。通过详细的代码示例和解题模板,帮助考生掌握递归、排序算法、字符串处理等核心考点,并分享考场时间分配与调试策略,助力高效备考。

weixin_28728715的博客 336

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

JavaSE基础面试题之面向对象(6)

JavaSE基础面试题之面向对象说说递归方法的作用及优缺点?简述this关键字的使用简述Java中静态代码块的特点。使用递归实现二分查找多种方式实现猴子吃桃问题编程题:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13....求出这个数列的前20项之和。 说说递归方法的作用及优缺点? 递归方法可以使用重复方法、少量代码,即可实现复杂功能的实现; 递归方法一定要有出口,否则无限递归调用,直到出现StackOverflowError(栈内存溢出)错误; 递归方法的递归次数也不能过多,否则同样出

阳光宅男的博客 255

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

特殊二分总结:shopee二面算法题(又是该死的二分

最近面了shopee新加坡office,在二面中遇到了一道有意思的题目。 题目分为两部分,开始比较简单,followup会有难度(但是也是之前遇到过总结过的二分,但是该死的又是没有自己想出来 题目: 给出一个升序数组,其中每个数字代表的是每个空位置的坐标。现在要给三个人安排位置,要求使他们之间距离最大(以相邻两个人距离中较小的距离为距离) 解法: 首先肯定要把一个安排在最左边,一个在最右边(贪心,...

weixin_43462819的博客 2054

C程序设计(谭浩强第五版)第五章习题精解。C语言课后习题解析。C语言考研,C语言专升本,C语言期末考试,初学C语言,程序设计基础,编程题必备。C语言第四章:选择结构程序设计编程题解析。

目录 C程序设计(谭浩强第五版)第五章习题精解 第五章:循环结构程序设计目录: 2.请补充例5. 7程序,分别统计当“fabs(t)>= le- 6”和“fabs(t)> = le-8”时执行循环体的次数。 3.输人两个正整数m和n,求其最大公约数和最小公倍数 4.输人一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。 5.求$S_n$=a+aa+aaa+...+$\overbrace{aa+\dots+a}^{n个a}$ 之 值,其中a是一个数字,n表示a的位数,n由键

立志冲海大 1379

875. 爱吃香蕉的珂珂(算法思维系列)

875. 爱吃香蕉的珂珂题目解题思路代码 题目 珂珂喜欢吃香蕉。这里有 N 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 H 小时后回来。 珂珂可以决定她吃香蕉的速度 K (单位:根/小时)。每个小时,她将会选择一堆香蕉,从中吃掉 K 根。如果这堆香蕉少于 K 根,她将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉。 珂珂喜欢慢慢吃,但仍然想在警卫回来前吃掉所有的香蕉。 返回她可以在 H 小时内吃掉所有香蕉的最小速度 K(K 为整数)。 解题思路 见书360 代码 clas

Hello World 218

Hdu 6178 Monkeys【树形Dp-最小点覆盖+贪心思维】

Monkeys Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 153428/153428 K (Java/Others) Total Submission(s): 384    Accepted Submission(s): 121 Problem Description There is a tree having

mengxiang000000 1124
上一篇: 【Redis】搞懂过期删除策略和内存淘汰策略
下一篇: Marshmallow,一个有点甜的Python库
海哥python
博客等级 码龄9年 1487粉丝 74原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海哥python

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值