当前位置:网站首页>【综合笔试题】难度 4.5/5,超超超经典数学运用题
【综合笔试题】难度 4.5/5,超超超经典数学运用题
2022-08-04 11:31:00 【宫水三叶的刷题日记】
题目描述
这是 LeetCode 上的 458. 可怜的小猪 ,难度为 困难。
Tag : 「数学」
有 buckets
桶液体,其中 正好 有一桶含有毒药,其余装的都是水。它们从外观看起来都一样。
为了弄清楚哪只水桶含有毒药,你可以喂一些猪喝,通过观察猪是否会死进行判断。不幸的是,你只有 minutesToTest
分钟时间来确定哪桶液体是有毒的。
喂猪的规则如下:
选择若干活猪进行喂养 可以允许小猪同时饮用任意数量的桶中的水,并且该过程不需要时间。 小猪喝完水后,必须有 minutesToDie
分钟的冷却时间。在这段时间里,你只能观察,而不允许继续喂猪。过了 minutesToDie
分钟后,所有喝到毒药的猪都会死去,其他所有猪都会活下来。重复这一过程,直到时间用完。
给你桶的数目 buckets
,minutesToDie
和 minutesToTest
,返回在规定时间内判断哪个桶有毒所需的 最小 猪数。
示例 1:
输入:buckets = 1000, minutesToDie = 15, minutesToTest = 60
输出:5
示例 2:
输入:buckets = 4, minutesToDie = 15, minutesToTest = 15
输出:2
示例 3:
输入:buckets = 4, minutesToDie = 15, minutesToTest = 30
输出:2
提示:
数学
我们用实验对象来代指题干的小动物。同时为了方便,我们使用 代指有多少桶水, 为实验对象的反应时间, 为测试总时间。
根据题意,最大测试次数为 。
我们可以先考虑 的情况,最简单的情况是,我们使用与水同等数量的实验对象数量来进行测试。
此时哪个实验对象有反应,则可以推断出哪一桶水有问题。
但这样的测试方式,每个实验动物承载的信息量是很低的,每个实验对象仅承载了某一桶水是否有问题。
为减少实验对象数量,我们需要增大每个实验对象承载的信息量(让每个实验对象同时测试多桶水),然后从最终所有实验对象的状态(是否有所反应)来反推哪一桶水有问题。
用最小单位表示最大信息量,这引导我们使用「进制表示」相关方式。由于我们只有 次测试机会,因此我们可以使用二进制的方式进行测试。
当 ,使用二进制的方式测试哪桶水有问题,我们至少需要 个实验对象(其中 为 的二进制表示的长度),然后让编号为 ()的实验对象喝掉二进制表示中第 位为 的水。
最终这 个实验对象会对应一个结果序列:如果编号 的实验对象没有反应,说明有问题的水的二进制表示中第 位为 ,如果编号为 的实验对象有反应,则说明有问题的水的二进制表示中第 为 。即根据最终每个实验对象的状态,我们可以完整地反推回有问题的水的编号是多少。
当 时,相当于在原问题基础上,多考虑一层「轮数」维度,即不仅考虑某个实验对象是否有所反应,还需要考虑是在哪一轮有所反应。
我们还是使用「进制表示」的方式来最大化每个单位所能承载的最大信息量。
具体的,我们先使用 进制对所有水进行编号,此时每桶水都有唯一的进制表示编码。然后我们考虑「什么时候」将水喂给「哪个实验对象」。
其中一种可行的测试方式是:设定需要的实验对象数量 为 进制数的长度,若某桶水的 进制中的第 位为 (),则代表将该水在第 轮喂给编号为 的实验对象。
同理,利用最终的结果矩阵,我们可以反推回是哪一桶水是有问题的。
上述做法,只是阐述了我们存在这样的可行解,需要证明这样的做法是最优解。
利用 香农熵,我们可以计算明确熵值,公式为:
其中 代表随机事件 的发生概率。
对于本题,记随机事件 为 桶水中哪一个桶有问题,概率为 。
记随机事件 为在测试轮数为 时,所有实验对象的最终状态,每个实验对象的状态共有 种,即共有 种最终结果,可近似看做等概率 。
我们需要求得在满足 前提下的最小 值。
代入公式可得:
移项化简得:
代码:
class Solution {
public int poorPigs(int n, int d, int t) {
int k = t / d;
return (int) Math.ceil(Math.log(n) / Math.log(k + 1));
}
}
时间复杂度: 空间复杂度:
最后
这是我们「刷穿 LeetCode」系列文章的第 No.458
篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先把所有不带锁的题目刷完。
在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。
为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:https://github.com/SharingSource/LogicStack-LeetCode 。
在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。
更多更全更热门的「笔试/面试」相关资料可访问排版精美的 合集新基地
边栏推荐
- 【飞控开发高级教程7】疯壳·开源编队无人机-编队飞行
- MySQL不提供数组,只能做成表吗?
- Advanced transcriptome analysis and R data visualization hot registration (2022.10)
- ECCV 2022 | 清华&腾讯AI Lab提出REALY: 重新思考3D人脸重建的评估方法
- Learn to use the basic interface of set and map
- 【目标检测】yolov3特征提取网络------Darknet53网络及pytorch实现
- 多行函数;group_by分组;having分组后筛选;单表查询总结
- 超美星空特效,你Get了吗?
- POJ3687Labeling Balls题解
- 六石编程学:编程中的直线思维与自然思维
猜你喜欢
Win11 file types, how to change?Win11 modify the file suffix
Leetcode刷题——543. 二叉树的直径、617. 合并二叉树(递归解决)
audio_policy_configuration.xml配置文件详解
Xilinx VIVADO 中 DDR3(Naive)的使用(2)读写设计
命令模式(Command)
面试蚂蚁(P7)竟被MySQL难倒,奋发图强后二次面试入职蚂蚁金服
数据库对象
CVPR 2022 | 从人体网格预测骨架,是真正的生理学骨架!
【黄啊码】MySQL入门—1、SQL 的执行流程
HyperLynx仿真(一)LineSim简单介绍
随机推荐
【LeetCode】700.二叉搜索树
*iframe*
强烈推荐一款优秀且通用的后台管理系统
复盘:经典的HR面试问题,这些问题可以挖掘你个人的素质,看看你是否合适合我们部门
云原生Devops 的实现方法
Advanced transcriptome analysis and R data visualization hot registration (2022.10)
上帝空间——全球首个基于Web3.0的艺术协议创意平台,拓宽多元艺术融合边界
【黄啊码】MySQL入门—2、使用数据定义语言(DDL)操作数据库
Xilinx VIVADO 中 DDR3(Naive)的使用(1)创建 IP 核
【LeetCode】1403.非递增顺序的最小子序列
从零开始Blazor Server(7)--使用Furion权限验证
Mysql高级篇学习总结13:多表连接查询语句优化方法(带join语句)
Mysql高级篇学习总结14:子查询优化、排序优化、GROUP BY优化、分页查询优化
SkiaSharp 之 WPF 自绘 粒子花园(案例版)
手搓一个“七夕限定”,用3D Engine 5分钟实现烟花绽放效果
蒲丰投针学习笔记
职责链模式(responsibilitychain)
POJ2367Genealogical tree题解
六石编程学:编程中的直线思维与自然思维
北京大学,新迎3位副校长!其中一人为中科院院士!