LeetCode每日一题:458.可怜的小猪

题目介绍

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

进阶:
假设有 n 只水桶,猪饮水中毒后会在 m 分钟内死亡,你需要多少猪(x)就能在 p 分钟内找出 “有毒” 水桶?这 n 只水桶里有且仅有一只有毒的桶。

提示:
可以允许小猪同时饮用任意数量的桶中的水,并且该过程不需要时间。
小猪喝完水后,必须有 m 分钟的冷却时间。在这段时间里,只允许观察,而不允许继续饮水。
任何给定的桶都可以无限次采样(无限数量的猪)。

解题思路

一开始我的思路是:

  1. 先是对1000个水桶进行二进制编号,比如1号水桶:0000 0001;2号水桶:0000 0010。学过数电的我很自信地就给了每个水桶8位的二进制码,因为8位二进制码可以表示的数可从0~2^8嘛!桶的编号决定了哪头猪要喝水。
  2. 然后就直接用8头猪来实验。假设?的编号为1~8从左至右,当我们要检测第一桶水(0000 0001)的时候只给8号猪喝这桶水;检测第二桶水(0000 0010)时只给编号为7的猪喝水;检测第三桶水(0000 0011)只给编号为7号和8号的猪喝水,以此下去。
  3. 按照上面的过程喝水的话,假设第三桶水有毒,那么此时因为编号7和编号8的猪都喝了这桶水,可将中毒现象设为1,非中毒现象设为0,很明显这个现象为0000 0011,此时现象也对应着桶的编号

上述思路的代码也很简单,可以for循环找到某个x的值,此值的2的x次方恰好大于1000的x的值,然后返回x就可以了。

想法很美好,提交后的结果很残酷~

提交后显示1000桶水的值为5,而不是8,5?
…思索中

想不出来,上网搜吧~~~参考了这位大神的文章我才顿悟了?https://blog.csdn.net/lucky52529/article/details/85110278
文章中的二维平面喝水的那个让我联想到了矩阵键盘的行扫描和列扫描~

下面为顿悟后的程序~

实现代码

import math
class Solution(object):
    def poorPigs(self, buckets, minutesToDie, minutesToTest):
        if buckets == 0:
            return 0
        return int(math.ceil(math.log(buckets,minutesToTest/minutesToDie+1)))

总结归纳

也想了想我的那种方法的可行性,发现那个是可以,但不是用来求最少问题的。类似这种思维性的题目还是得多练呐~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值