逻辑思维题:1500桶蜂蜜,其中1桶有毒,熊二喝下去10分钟内死亡,想用1小时时间找出毒蜂蜜,需要几只熊?

逻辑思维题:1500桶蜂蜜,其中1桶有毒,熊二喝下去会死亡,想用找出毒蜂蜜,需要几只熊?

我目前算的答案是7只,有人说正确答案是5只,有没有大佬说一下的,我也不知道哪个答案正确

欢迎提出自己的思路,那些玩文字游戏的爽闭嘴,我朋友把这个问题发给我的时候,我也感觉有很多BUG,比如:是不是只喝一口就行?万一喝到最后不够了怎么办?中间需要停多久观察反应?这么找下去这个题没法玩,但是我知道出题人的意思,我只想找到这个问题的答案,我以为别人也会把焦点放到找到最终解上,哎,我高估了!还有那些说第一桶就有毒的人,我脑子嗡嗡的!我待会去别的论坛下面提问一下,看看是不是所有语言下面的程序员都爱玩文字游戏

让PHP再次伟大
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
野犭
最佳答案

灵感来自 @yaoxs 评论

首先假设每只熊每轮次每桶只喝一口,一桶有无限口,喝一口需要耗时为 0,即瞬间喝完

验毒一轮需要 10 分钟,所以最多 6 轮

假设需要 X 只熊,每只熊每轮次需要喝 Pn不考虑交叉试毒,而且每轮次都有熊中毒(最优)

第一轮

X * P1 = 1500

第二轮

(X - 1) * P2 = P1

第三轮

(X - 2) * P3 = P2

第四轮

(X - 3) * P4 = P3

第五轮

(X - 4) * P5 = P4

第六轮

(X - 5) * P6 = P5

要想准确知道哪一桶有毒,则最后一轮每只熊只能喝一桶

带入 P6 = 1 得到

X(X-1)(X-2)(X-3)(X-4)(X-5) = 1500

数学太差不会解,Google 得到这个方程的图表是这样的

file

如下结果,当 X ≈ 6.32 时,Y = 1500

file

结论:最少需要 6 只成年熊加 1 只小熊等于 7 只熊

P.S. 题目不够严谨,就算不玩文字游戏也需要另外设定条件,楼主随口一问,我就随口一答,大家就看个热闹好了

2年前 评论
ALpython 2年前
renxiaotu 2年前
ALpython 2年前
勇敢的心 (楼主) 2年前
滚球兽进化 2年前
MidHack 2年前
讨论数量: 77

把桶排序为1~1500

第1秒让熊二吃第1桶

第2秒让熊二吃第2桶

….

当熊二死亡时记录花了s
那就是第s-600(10分钟)桶有毒

累计耗熊1只
累计耗时600~2100秒(10~35分钟)

如果熊二够快,每纳秒吃一桶,那10分钟就找到了

正确答案:1只

附:如果限制为吃完一次冷却10分钟,题目中提到的5只是可以做到的
5只熊5次最多试出1546

代码如下:


/**算法
 * @param int $bears  熊的数量
 * @param int $number 尝试次数
 * @return int 最多可试出桶数
 */
function getCount(int $bears, int $number):int
{
    if($bears<1 || $number<1){
        return 0;//如果没有熊了或者没有次数了,没法试
    }

    //剩余次数等于1
    if($number==1){
        return $bears+1;//n只熊1次试出结果最多n+1桶,每只熊一桶,留一桶
    }

    //剩余次数大于1
    return
        //要喝的总量
        getCount($bears-1,$number-1)   //单只熊喝的数量
        *$bears                                      //熊的数量

        //不用喝的量
        +getCount($bears,$number-1);        //如果没死,熊不变,次数减少
}

//测试
getCount(5,5);//1546
2年前 评论
最後的我們 2年前
Su 2年前
邢闯洋 2年前
vition 2年前
勇敢的心 (楼主) 2年前
overfalse 2年前
滚球兽进化 2年前
根据评论区找到了原题, 发现正确答案是 4 只熊,
我之前写的没考虑到根本用不着第6, 因为如果第5次没死,6次必然会死.
正确答案:
int poorPigs(int buckets, int minutesToDie, int minutesToTest) {
        int base=minutesToTest/minutesToDie+1;
        return ceil(log(buckets)/log(base));
    }

作者:xiaok0707
链接:https://leetcode-cn.com/problems/poor-pigs/solution/leetcode-458-njin-zhi-si-xiang-by-xiaok0-819a/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
<?php

/**
 * 
 * 前提: 假设熊可以一次性喝多桶蜂蜜
 *  
 * 题解: 1. 把 1500 桶蜂蜜可以按 6 进制编码排号, 比如第 1500 桶的编号为 10540
 * 2. 5 只熊分别对应桶编号的位数, 第一次, 第一只熊喝桶编号为 0**** 的蜂蜜 第二只喝 *0*** 的蜂蜜, 以此类推
 * 3. 等 10 分钟后, 第二次, 第一只熊喝桶编号为 1**** 的蜂蜜 第二只喝 *1*** 的蜂蜜, 以此类推到第6次
 * 4. 第 6 次, 根据第几只熊在第几次死亡的信息就可以得出哪一桶是有毒的, 比如 第一只熊在第一次死亡, 第二只
 * 在第二次死亡, 第三只在第五次死亡, 第四只和第五只在第六次同时死亡, 得出 01455 编号的桶有毒
 * 
 * @param int $bucket 桶
 * @param int $times  次数
 */
function getLeastBearCount($bucket, $times) 
{
    if ($times <= 0) {
        return 0;
    }
    if ($times == 1) {
        $times = 2;
    }
    for ($bearCount = 1; pow($times, $bearCount) - 1 < $bucket; $bearCount++) {
        // pass
    }
    return $bearCount;
}

echo getLeastBearCount(1500, 60 / 10);
// 5
2年前 评论
李铭昕 2年前
ononl 2年前
MidHack 2年前

你怎么算的?是否只有死亡了,才能确定这个蜜蜂有毒?是否一定要等10分钟才能确定这个是有毒的?如果是的话,一个小时内要得出结论的话,怎么也需要250只熊,而且要死亡一只熊,才能保证在1个小时内。得出结论?

2年前 评论

熊喝蜂蜜不用时间吗

2年前 评论
oliver-l (作者) 2年前
勇敢的心 (楼主) 2年前
勇敢的心 (楼主) 2年前
oliver-l (作者) 2年前
oliver-l (作者) 2年前
勇敢的心 (楼主) 2年前

是哦,每一瓶喝一下,间隔多久呢?间隔30秒,1分钟?

2年前 评论

把桶排序为1~1500

第1秒让熊二吃第1桶

第2秒让熊二吃第2桶

….

当熊二死亡时记录花了s
那就是第s-600(10分钟)桶有毒

累计耗熊1只
累计耗时600~2100秒(10~35分钟)

如果熊二够快,每纳秒吃一桶,那10分钟就找到了

正确答案:1只

附:如果限制为吃完一次冷却10分钟,题目中提到的5只是可以做到的
5只熊5次最多试出1546

代码如下:


/**算法
 * @param int $bears  熊的数量
 * @param int $number 尝试次数
 * @return int 最多可试出桶数
 */
function getCount(int $bears, int $number):int
{
    if($bears<1 || $number<1){
        return 0;//如果没有熊了或者没有次数了,没法试
    }

    //剩余次数等于1
    if($number==1){
        return $bears+1;//n只熊1次试出结果最多n+1桶,每只熊一桶,留一桶
    }

    //剩余次数大于1
    return
        //要喝的总量
        getCount($bears-1,$number-1)   //单只熊喝的数量
        *$bears                                      //熊的数量

        //不用喝的量
        +getCount($bears,$number-1);        //如果没死,熊不变,次数减少
}

//测试
getCount(5,5);//1546
2年前 评论
最後的我們 2年前
Su 2年前
邢闯洋 2年前
vition 2年前
勇敢的心 (楼主) 2年前
overfalse 2年前
滚球兽进化 2年前

不玩文字游戏的话,1500/6= 250 也就是说1500桶最多可以分6份喝完,每只熊喝250桶,最后一份不用找熊喝,前面5只熊没挂的话,那肯定就是最后250桶的其中一桶有毒,所以5只熊就够了

2年前 评论

每只熊喝完一桶需要等待10分钟,1小时只能喝5桶,,

2年前 评论

既然不考虑一头熊喝一桶的耗时,为什么最后的问题是一小时内呢?

2年前 评论

这个题,如果是要知道这1500桶的蜂蜜有毒蜂蜜,感觉一头熊就够了,喝1500桶(没有耗时),等10分钟就知道了。如果是要知道这1500桶中是具体哪桶有毒,那么每头熊喝完一桶就需要等待10分钟,5 头 、7 头 显然不够

2年前 评论
风吹过有夏天的味道 2年前
Su (作者) 2年前
Su (作者) 2年前
勇敢的心 (楼主) 2年前

一只熊就够了:抓住出题的人,10 分钟找不出来一熊掌拍死他

2年前 评论

不太喜欢这种「开放性」的题目,有点像小学题目,「10 块钱能买几只铅笔?」,农村可能比较便宜,城市贵,个人消费水平也不一样,然后明明题目是「开放性」的,而答题是填鸭式的。就像数学题,忘记最小公约数了,然后 15 分只得 5 分吧,题目没写要最小,所以自己也忘记了。

2年前 评论
勇敢的心 (楼主) 2年前

这种有明显逻辑漏洞的逻辑思维题是真的sb

2年前 评论
勇敢的心 (楼主) 2年前
Su 2年前
勇敢的心 (楼主) 2年前

个人愚见,如果有5头熊,那么1500桶蜂蜜就应该分成6等份。每一头熊舔250蜂蜜,等10分钟看看哪一只熊倒霉GG了(没死就是另外250桶其中一桶有毒) 剩下250桶,再分成5减去死掉的一只,再等10分钟 看看 逻辑就是1500一直除,除到确定到熊喝有毒的那桶蜂蜜而已 这道题应该是 找到有毒的那桶蜂蜜,需要死几只熊

2年前 评论
李铭昕

x熊 c次 t桶

1x 1c = 2t

2x 2c = 2t * 3 = 6t

3x 3c = 6t * 4 = 24t

4x 4c = 24t * 5 = 120t

5x 5c = 120t * 6 = 720t

6x 6c = 720t * 7 = 5040t

所以6只熊60min的时候,就能检测5000T蜂蜜了,显然结果应该 <=6

1x 2c = 3t

2x 3c = 3t * 3 = 9t

3x 4c = 9t * 4 = 36t

4x 5c = 36t * 5 = 180t

5x 6c = 180t * 6 = 1080t

所以,感觉1500t还是需要6只熊,但是感觉吧,应该有办法能5只熊搞定,没时间想,就放着吧。。。

不过,这个题常考的 不是这种类型

而是 1000桶蜂蜜只有一桶无毒,且沾一点就死,问你需要多少熊,只需要每只喂一次,且同时喂,能把无毒的找出来。

2年前 评论
Su 2年前
李铭昕 (作者) 2年前

既然来论坛提问题,首先题目要清晰明了不是吗?有提问的智慧,还有,无论是什么回答,没有人对你恶言相向希望对回答你问题的人也给予一定的尊重吧,不能把题目编辑一下更好明白吗

2年前 评论
勇敢的心 (楼主) 2年前
勇敢的心 (楼主) 2年前
根据评论区找到了原题, 发现正确答案是 4 只熊,
我之前写的没考虑到根本用不着第6, 因为如果第5次没死,6次必然会死.
正确答案:
int poorPigs(int buckets, int minutesToDie, int minutesToTest) {
        int base=minutesToTest/minutesToDie+1;
        return ceil(log(buckets)/log(base));
    }

作者:xiaok0707
链接:https://leetcode-cn.com/problems/poor-pigs/solution/leetcode-458-njin-zhi-si-xiang-by-xiaok0-819a/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
<?php

/**
 * 
 * 前提: 假设熊可以一次性喝多桶蜂蜜
 *  
 * 题解: 1. 把 1500 桶蜂蜜可以按 6 进制编码排号, 比如第 1500 桶的编号为 10540
 * 2. 5 只熊分别对应桶编号的位数, 第一次, 第一只熊喝桶编号为 0**** 的蜂蜜 第二只喝 *0*** 的蜂蜜, 以此类推
 * 3. 等 10 分钟后, 第二次, 第一只熊喝桶编号为 1**** 的蜂蜜 第二只喝 *1*** 的蜂蜜, 以此类推到第6次
 * 4. 第 6 次, 根据第几只熊在第几次死亡的信息就可以得出哪一桶是有毒的, 比如 第一只熊在第一次死亡, 第二只
 * 在第二次死亡, 第三只在第五次死亡, 第四只和第五只在第六次同时死亡, 得出 01455 编号的桶有毒
 * 
 * @param int $bucket 桶
 * @param int $times  次数
 */
function getLeastBearCount($bucket, $times) 
{
    if ($times <= 0) {
        return 0;
    }
    if ($times == 1) {
        $times = 2;
    }
    for ($bearCount = 1; pow($times, $bearCount) - 1 < $bucket; $bearCount++) {
        // pass
    }
    return $bearCount;
}

echo getLeastBearCount(1500, 60 / 10);
// 5
2年前 评论
李铭昕 2年前
ononl 2年前
MidHack 2年前
野犭

灵感来自 @yaoxs 评论

首先假设每只熊每轮次每桶只喝一口,一桶有无限口,喝一口需要耗时为 0,即瞬间喝完

验毒一轮需要 10 分钟,所以最多 6 轮

假设需要 X 只熊,每只熊每轮次需要喝 Pn不考虑交叉试毒,而且每轮次都有熊中毒(最优)

第一轮

X * P1 = 1500

第二轮

(X - 1) * P2 = P1

第三轮

(X - 2) * P3 = P2

第四轮

(X - 3) * P4 = P3

第五轮

(X - 4) * P5 = P4

第六轮

(X - 5) * P6 = P5

要想准确知道哪一桶有毒,则最后一轮每只熊只能喝一桶

带入 P6 = 1 得到

X(X-1)(X-2)(X-3)(X-4)(X-5) = 1500

数学太差不会解,Google 得到这个方程的图表是这样的

file

如下结果,当 X ≈ 6.32 时,Y = 1500

file

结论:最少需要 6 只成年熊加 1 只小熊等于 7 只熊

P.S. 题目不够严谨,就算不玩文字游戏也需要另外设定条件,楼主随口一问,我就随口一答,大家就看个热闹好了

2年前 评论
ALpython 2年前
renxiaotu 2年前
ALpython 2年前
勇敢的心 (楼主) 2年前
滚球兽进化 2年前
MidHack 2年前

让我想起一段马云的视频。提问者:马总,你不要跟我说那些,我只想知道怎么能赚到钱。 题目有问题,你也知道(然而并不打算改),缺少足够条件。很多人对题目的理解完全不一样,怎么去计算答案。如果是想来跟大家讨论答案安全可以把条件补充完整,不是动不动就喷别人玩文字游戏,明明有好几个都是有认真的在计算,只不过和你的理解不一样罢了,完全可以把条件(至少你理解的条件)补充完整。就算别人调侃几句又怎么了,这就恶心?就要人爬?这里又不是付费咨询。

2年前 评论

7 只。1500/7/6/5/4/3。

1500 桶🪣蜂蜜,让 7 只熊去分配 1500 桶,第一轮直接过滤了 1286 或 1285 桶,剩下 214 或 215 桶,然后死了一只熊后,剩下的 6 只熊从死过的熊喝过的蜂蜜桶里继续分配。

这样分配下来 5 次,1500/7/6/5/4/3,即可尝试出哪一瓶有毒。

2年前 评论
勇敢的心 (楼主) 2年前
chowjiawei

我问下 熊二 是一个熊的名字吗

2年前 评论
chowjiawei (作者) 2年前
勇敢的心 (楼主) 2年前
勇敢的心 (楼主) 2年前

下面是2进制图解,我是理解的是最少用多少资源可以表示最多的数字。

Laravel

其中 xxxxxx|0000 的无法用作表示(因为无法完全用时间判断某一桶是否有毒),所以6组加5个熊实际上能验证的数量为2^11 - 2^6 +1 = 2048 - 64 + 1 = 1985(之所以 +1,是因为 1984 桶都没有熊死去的话,就存在在 1984 桶意外,如果之外的数量只有 1,那么这一桶一定有毒)

Laravel

如果 10 分钟内一通蜂蜜只能让一只熊喝。以此为前提
可以分为 6 份。
2^6 = 64 : 此时一只熊可以判断64桶。
1500/64 = 23.4375 :此时需要23.43次得出结果。
log(2)23.4375 =4.x 向上取整 得 5。
这个题我是认为其实是用最少用多少资源可以表示1500这个数字。把60分钟视为6个资源,然后补5个资源(熊) 可以表示 2048 大于 1500 。

2年前 评论
滚球兽进化 (作者) 2年前
滚球兽进化 (作者) 2年前
/**算法
 * @param int $bears  熊的数量
 * @param int $number 尝试次数
 * @return int 最多可试出桶数
 */
function getCount(int $bears, int $number):int
{
    if($bears<1 || $number<1){
        return 0;//如果没有熊了或者没有次数了,没法试
    }

    //剩余次数等于1
    if($number==1){
        return $bears+1;//n只熊1次试出结果最多n+1桶,每只熊一桶,留一桶
    }

    //剩余次数大于1
    return
        //要喝的总量
        getCount($bears-1,$number-1)   //单只熊喝的数量
        *$bears                                      //熊的数量

        //不用喝的量
        +getCount($bears,$number-1);        //如果没死,熊不变,次数减少
}

//测试
for ($bears=1;$bears<6;$bears++){
    for ($number=1;$number<6;$number++){
        echo "{$bears}只熊{$number}次最多试出:".getCount($bears,$number)."\n";
    }
}

测试结果:

1只熊1次最多试出:2

1只熊2次最多试出:2

1只熊3次最多试出:2

1只熊4次最多试出:2

1只熊5次最多试出:2

2只熊1次最多试出:3

2只熊2次最多试出:7

2只熊3次最多试出:11

2只熊4次最多试出:15

2只熊5次最多试出:19

3只熊1次最多试出:4

3只熊2次最多试出:13

3只熊3次最多试出:34

3只熊4次最多试出:67

3只熊5次最多试出:112

4只熊1次最多试出:5

4只熊2次最多试出:21

4只熊3次最多试出:73

4只熊4次最多试出:209

4只熊5次最多试出:477

5只熊1次最多试出:6

5只熊2次最多试出:31

5只熊3次最多试出:136

5只熊4次最多试出:501

5只熊5次最多试出:1546

5次是对的

2年前 评论

file

看了别人的解答

function poorPigs($buckets, $minutesToDie, $minutesToTest) {
    // 算出可以实验多少回合
    // 每回合还有多少头猪可以进行下一回合实验
    $states = $minutesToTest / $minutesToDie + 1;
    return ceil(log($buckets) / log($states));
}

echo "buckets=1000, minutesToDie=15, minutesToTest=60: " . poorPigs(1000,15,60) . PHP_EOL;
echo "buckets=4, minutesToDie=15, minutesToTest=15: " . poorPigs(4,15,15) . PHP_EOL;
echo "buckets=4, minutesToDie=15, minutesToTest=30: " . poorPigs(4,15,30) . PHP_EOL;

题解

Laravel
复制图片,在新页面中打开

2年前 评论

答案是 4 只熊,力扣有这题:458可怜的小猪

2年前 评论
勇敢的心 (楼主) 2年前
MidHack (作者) 2年前
Su 2年前
MidHack (作者) 2年前
porygonCN

我还没看评论,也不知道正确答案,谨说出自己思路 按照喝蜂蜜不耗时间且熊能无限喝直到毒死,一小时最多6轮 设最少x只熊,每只熊喝1500/x桶,不一定是整数

  • 第一轮:每只熊喝1500/x桶 必有一只死的,则剩x-1只熊 需要验证1500/x桶
  • 第二轮:每只熊喝(1500/x)/(x-1)桶 必有一只死的,则剩x-2只熊 需要验证(1500/x)/(x-1)桶
  • ....

假设至多6轮出结果:0<=x^(x-1)^(x-2)^(x-3)^(x-4)^(x-5)-1500, 画出函数图如下,可以看出1~5的时候取值都是0,6的时候远大于1500

file

反向验算: x=6

  • 第一轮 1500/6=250
  • 第二轮 250/5=50
  • 第三轮 50/4=12余2 进为13
  • 第四轮 13/3=4 余1 进为5
  • 第五轮 5/2=2 余1 进为2
  • 第六轮 2/1 死了是喝的那个,没死是另一桶
2年前 评论
porygonCN (作者) 2年前

最开始想到的是二分查找,腾讯有道算法题很类似,好像是使用二进制来标记解决,具体忘记了。

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!