可怜的小猪

458. 可怜的小猪 桶液体,其中一桶含有毒药,其余装的都是水。它们从外观看起来都一样。为了弄清楚哪只水桶含有毒药,你可以喂一些猪喝,通过观察猪是否会死来判断。这是一个关于信息编码和组合数学的问题。可以通过分析每只猪在给定时间内能够区分的桶数,来确定需要多少只猪才能区分所有的桶。,返回在规定时间内判断哪个桶有毒所需的最小猪数。分钟时间来确定哪桶液体是有毒的。 阅读详情

刷LeetCode刷到这道题,不由的感叹“妙啊”!
题目是hard类型的,看完题解后感觉就是easy类型的。

题目描述

有 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

分析

最开始我想着应该让每次死去的小猪最小化,把桶分组,每桶液体就给一头小猪喝,比如1000桶如果给x只小猪喝,可以分成x+1组,幸运的话还能所有小猪不死。但是喂液体的次数受限,很容易不能在规定的时间 minutesToTest内完成任务。
我百思不得其解,瞥了一眼题解,豁然开朗。这简直就是近乎要让所有的小猪死去,充分利用上每一只小猪,确实是像题目写的那样,是可怜的小猪。

每一只猪有多少种状态
如果minutesToTest / minutesToDie = 0,那么每一只猪只有一种状态,即存活。
如果 minutesToTest / minutesToDie = 1,那么每一只猪有两种状态,存活或者死亡。
在这里插入图片描述

如果 minutesToTest / minutesToDie = 2,那么每一只猪有三种状态,存活、在第一次测试后死亡、在第二次测试后死亡。
在这里插入图片描述
进一步而言,如果 minutesToTest / minutesToDie = 3,那么每一只猪有三种状态,存活、在第一次测试后死亡、在第二次测试后死亡、在第三次测试后死亡。
在这里插入图片描述

因此每一只猪的状态数量为 states = minutesToTest / minutesToDie + 1。

x 只 2 状态的猪最多可以测试多少个水桶?
1 只猪可以测试 1 个水桶:让它喝下桶 1 的水,如果存活说明 2 号桶是毒药,如果死亡说明 1 号桶是毒药。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
如果超过三只小猪,我已无法用三维空间表示出来了。2状态的小猪,让每一只喝掉一半的液体(每一只小猪死去的概率是二分之一,这个概率非常乐观)。

x 只 s 状态的猪最多可以测试多少个水桶?
下图是一只4状态的小猪,一只小猪可以测四桶,
在这里插入图片描述
2只小猪可以测 42 桶。
在这里插入图片描述
4状态的小猪,最多可以喝三次,没死还得接着喝。每次让每一只喝掉四分之一的液体(每只小猪死去的概率是四分之三,同情小猪)。

x 只 s 状态的猪最多可以测试sxs^{x}sx桶,因此我们需要找到最小的 x,那么每一只猪只有一种状态,即存活。使得sx≥buckets^x≥bucketsx≥bucket,那么每一只猪只有一种状态,即存活。其中 s = minutesToTest / minutesToDie + 1表示每只猪的状态数。因此答案x>logsbucketsx>log_s bucketsx>logs​buckets。根据换底公式,我们可以得到x≥logbucketslogsx≥\frac{log buckets}{log s}x≥logslogbuckets​

代码

代码就很简单了

int poorPigs(int buckets, int minutesToDie, int minutesToTest) {
        int states = minutesToTest / minutesToDie + 1;
         return ceil(log(buckets) / log(states));
}

时间复杂度:O(1)。
空间复杂度:O(1)。
完结!

扫地机器人视觉+IMU融合导航路径规划技术详解 本文介绍了基于视觉-惯性里程计(VIO)的扫地机器人自主导航系统。系统硬件由RGB摄像头、IMU传感器和编码器组成,软件架构采用分层设计,包括传感器数据采集层、数据融合层、SLAM定位层和路径规划层。核心技术包括:1)融合视觉特征提取(ORB算法)与IMU预积分的VIO;2)基于栅格地图的SLAM构建;3)结合A*全局规划和动态窗口法(DWA)局部避障的路径规划。文章提供了完整的Python实现代码,涵盖传感器数据融合、特征匹配和运动估计等关键功能模块。该系统实现了扫地机器人的精准定位和环境感知能力。 阅读详情

相关推荐

【项目分享】RailTracker: 火车票务数据采集与分析

从12306使用爬虫爬取火车站及车次信息、火车票价 通过本项目,我们将带领访问者手把手完成火车票数据采集、数据清洗、数据集成、可视化的一整个流程!

zhushatong的博客 3343

香农信息熵之可怜的小猪

文章目录题目解析 题目 有 n 桶液体,其其中 正好 有一桶含有毒药,其装的都是水。它们从外观看起来都一样。为了弄清楚哪只水桶含有毒药,你可以喂一些猪喝,通过观察猪是否会死进行判断,实验对象的反应时间为 d 。不幸的是,你只有 t 时间来确定哪桶液体是有毒的。 解析 根据题意,最大测试次数为 num = ∣td∣\vert\frac{t}{d}\vert∣dt​∣ 考虑 num=1 时,也就是只进行一轮测试,容易想到可以使用与水同等数量的小猪来进行测试,n 个小猪喝 n 桶液体,哪个死翘翘哪一桶水有问题。

Jormungand_V的博客 793

ESP32+ST7789 LCD屏实战:5分钟搞定中文显示与图片渲染(附完整代码)

本文提供了一份详细的ESP32驱动ST7789 LCD屏幕的实战指南。通过清晰的SPI硬件连接说明、ESP-IDF框架下的初始化代码,以及图片渲染与中文字库构建的核心算法,帮助开发者快速实现中文显示与图片渲染功能,并附有完整的代码示例和性能优化技巧。

weixin_29189377的博客 437

小猪喝水测毒

问题: 给若干桶水,只有一桶水有毒,给若干只猪,可以测若干次,当给定猪数和测定的次数数后,可以最多从多少桶水中找到有毒的水。 解题: 假如有两只猪分别为A,B,只可以测一次,最多可以从4桶水中找到有毒的水: 桶的编号编号为1,2,3,4;则,A-1,B-2,AB-3(A-1就是A喝1号桶的水); 假如有两只猪分别为A,B,只可以测两次,最多可以从9桶水中找到有毒的水: 构造一个矩阵:1,2,3 4,5,6 ...

qq_35536179的博客 555

力软敏捷开发框架源码7.0.6旗舰版 JNPF开发平台3.4.5 企业版 旗舰版

JNPF作为作为一款深受用户喜爱的低代码产品,凭借雄厚的科研技术力量、丰富的软件开发项目经验、严谨的项目开发流程和高质量的售后服务,已成功帮助千家企业完成数字化项目,建立了覆盖不同行业客户和不同发展阶段的软件产品服务体系。

huoooos0的博客 1839

【Flink】状态编程: 订单超时告警

文章目录一、基础概念二、Flink状态编程1、支持的状态类型2、Managed Keyed State六种类型基本API状态的生命周期3、Managed Operator State三、案例:订单延迟告警统计1、需求描述2、需求分析3、数据与模型4、详细实现 一、基础概念 在Flink架构体系中,有状态计算可以说是Flink非常重要的特性之一。 有状态计算是指: 在程序计算过程中,在Flink...

一只皮皮熊 2862

Leetcode 458. 可怜的小猪 C++

Leetcode 458. 可怜的小猪 题目 有 1000 只水桶,其中有且只有一桶装的含有毒药,其余装的都是水。它们从外观看起来都一样。如果小猪喝了毒药,它会在 15 分钟内死去。 问题来了,如果需要你在一小时内,弄清楚哪只水桶含有毒药,你最少需要多少只猪? 回答这个问题,并为下列的进阶问题编写一个通用算法。 进阶: 假设有 n 只水桶,猪饮水中毒后会在 m 分钟内死亡,你需要多少猪(x)就能在 p 分钟内找出 “有毒” 水桶?这 n 只水桶里有且仅有一只有毒的桶。 提示: 可以允许小猪同时饮用任意数量

weixin_43750513的博客 392

dolphinscheduler-3.4.0

dolphinscheduler集群部署

docsz的博客 660

leetcode-可怜的小猪解法

418、可怜的小猪 有 1000 只水桶,其中有且只有一桶装的含有毒药,其余装的都是水。它们从外观看起来都一样。如果小猪喝了毒药,它会在 15 分钟内死去。 问题来了,如果需要你在一小时内,弄清楚哪只水桶含有毒药,你最少需要多少只猪? 回答这个问题,并为下列的进阶问题编写一个通用算法。 进阶: 假设有 n 只水桶,猪饮水中毒后会在 m 分钟内死亡,你需要多少猪(x)就能在 p 分钟内找出 “有...

我是小码搬运工 869

C# MES通信从入门到精通(1)——串口传输文件

本文详细介绍了在Mes通信领域如何使用串口发送文件,由实战经验总结,堪称MES通信领域的葵花宝典!

qq_34059233的博客 3749

RK3568平台(平台总线篇)Gsensor STK8BA50

Gsensor,即加速度传感器(Accelerometer),是一种用于测量物体加速度的电子设备。以下是其关键点:1.工作原理MEMS技术:大多数Gsensor基于微机电系统(MEMS),通过检测质量块的位移来测量加速度。压电效应:部分Gsensor利用压电材料在受力时产生电压的特性来测量加速度。2.主要功能加速度测量:测量物体在X、Y、Z三个方向上的加速度。倾斜检测:通过重力加速度判断设备的倾斜角度。运动检测:识别设备的运动状态,如静止、移动、晃动等。震动检测:感知设备的震动或冲击。

weixin_49303682的博客 479

【leetcode前500】458. 可怜的小猪

这是一道纯数学分析题,首先我们考虑minToDie和minToTest,这两个表明了可用的“批次”。 比如示例1,p=60/15=4,说明我们可以用n头猪,测试p=4次。 不妨假设毒药总是在最后一桶,而且测试总是从小到大开始测试。 假设n=1,也就是仅有一头猪,测试p=4次,可能的结果是: 1.第一次测试就中毒; 2.躲过第一次,第二次中毒; 3.躲过第二次,第三次中毒; 4.躲过第三次,第四次中毒; 5.躲过第四次,依然存活。 那么对于这一只猪可能有五种状态,s=p+1。 接下...

六六先森的博客 227

Simulink仿真模块 - Data Type Conversion

Data Type Conversion将输入信号转换为指定的数据类型 在仿真库中的位置为: Simulink / 常用模块 Simulink / Signal Attributes 模型为: 说明 DataTypeConversion模块可将任何 Simulink®数据类型的输入信号转换为您指定的数据类型。 注意 要通过指定模块参数来控制输出数据类型,或者要从下游模块继承数据类型,使用DataTypeConversion模块。要...

jk_101的博客 2519

leetcode 458. 可怜的小猪

答案 ret 就是 bit ^ ret >= buckets 时,ret 的最小值。尝试次数 times = minutesToTest / minutesToDie。每只猪可以承载的数据量 bit = times + 1。特殊的,注意 buckets 为 1 的情况。

fks143的专栏 313

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【经典算法题】可怜的小猪

【经典算法题】可怜的小猪 Leetcode 0458 可怜的小猪 题目描述:Leetcode 0458 可怜的小猪 分析 本题的考点:数学。 使用n、m、p来代表题目中的buckets、minutesToDie、minutesToTest。则我们最多进行k=⌊pm⌋k = \lfloor \frac{p}{m} \rfloork=⌊mp​⌋轮测试。 首先考虑一个简单情况,如果k=1,相当于我们只能进行一轮测试,则我们需要将猪看成二进制猪,将某桶水的编号转化为二进制,二进制下如果第i位是

weixin_42638946的博客 570

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

可怜的小猪问题:数学解法详解

本文详细解答了"可怜的小猪"问题:在给定测试时间(minutesToTest)和毒发时间(minutesToDie)条件下,用最少猪数确定有毒的桶。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 1万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

每日一题——可怜的小猪

题目链接 458. 可怜的小猪 - 力扣(LeetCode) (leetcode-cn.com) 题目概述 有 buckets 桶液体,其中 正好 有一桶含有毒药,其余装的都是水。它们从外观看起来都一样。为了弄清楚哪只水桶含有毒药,你可以喂一些猪喝,通过观察猪是否会死进行判断。不幸的是,你只有minutesToTest 分钟时间来确定哪桶液体是有毒的。 喂猪的规则如下: 选择若干活猪进行喂养 可以允许小猪同时饮用任意数量的桶中的水,并且该过程不需要时间。 小猪喝完水后,必须有 minutesTo.

gch12138的博客 242

458. 可怜的小猪 (信息论)

LeetCode: 458. 可怜的小猪 信息论 >> 数学 抄代码有一手 ((( import static java.lang.Math.*; class Solution { public int poorPigs(int buckets, int minutesToDie, int minutesToTest) { // 状态 int states = minutesToTest / minutesToDie + 1;

lankerens 349

Java实现 LeetCode 458 可怜的小猪

458. 可怜的小猪 有 1000 只水桶,其中有且只有一桶装的含有毒药,其余装的都是水。它们从外观看起来都一样。如果小猪喝了毒药,它会在 15 分钟内死去。 问题来了,如果需要你在一小时内,弄清楚哪只水桶含有毒药,你最少需要多少只猪? 回答这个问题,并为下列的进阶问题编写一个通用算法。 进阶: 假设有 n 只水桶,猪饮水中毒后会在 m 分钟内死亡,你需要多少猪(x)就能在 p 分钟内找出 “有毒...

南 墙 1万+

经典算法题之可怜的小猪(二)

这道题最开始不要去关注细节,去想到底应该怎么喂水。而是应该先思考在考察哪方面的问题,数组、链表、二叉树还是数学?那么仔细思考就能得出结论,本质上在考察数学中的 进制 问题。这道题初看的时候,很多人会纠结:到底需要多少只小猪,而每只小猪又应该具体如何喝水才能判断出哪只水桶有毒药?

2501_92927469的博客 187

leetcode458 可怜的小猪

leetcode458 可怜的小猪 有 1000 只水桶,其中有且只有一桶装的含有毒药,其余装的都是水。它们从外观看起来都一样。如果小猪喝了毒药,它会在 15 分钟内死去。 问题来了,如果需要你在一小时内,弄清楚哪只水桶含有毒药,你最少需要多少只猪? 回答这个问题,并为下列的进阶问题编写一个通用算法。 进阶: 假设有 n 只水桶,猪饮水中毒后会在 m 分钟内死亡,你需要多少猪(x)就能在 p 分...

慢慢变强大 774

力扣每日一题2021-11-25可怜的小猪

可怜的小猪458.可怜的小猪题目描述思路数学Java实现Python实现 458.可怜的小猪 题目描述 可怜的小猪 思路 数学 使用n代指多少桶水,d为实验对象的反应时间,t为测试总时间。 根据题意,最大测试次数为k=t/d。 考虑k=1的情况,最简单的情况是,使用与水同等数量的实验对象数量来进行测试。此时哪个实验对象有反应,则可以推断出哪一桶水有问题。 但是这样的测试方法是低效的,每个实验对象仅承载了一桶水是否有问题。 为减少实验对象数量,每个实验对象需要测试多桶水,然后从最终所有实验对象的状态来推测

wcy1034036507的博客 375
上一篇: 人脸活体检测论文:Multi-Modal Face Anti-Spoofing Based on Central Difference Networks
下一篇: Ubuntu工具推荐
OneQuestionADay
博客等级 码龄6年 24粉丝 30原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值