不准访问
- 积分
- 546
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2020-11-18
- 最后登录
- 1970-1-1
|
本帖最后由 YankeeDoodle 于 2021-4-22 11:27 编辑
解题思路
这道题初看的时候,很多人会纠结:到底需要多少只小猪,而每只小猪又应该具体如何喝水才能判断出哪只水桶有***?
这道题最开始不要去关注细节,去想到底应该怎么喂水。而是应该先思考在考察哪方面的问题,数组、链表、二叉树还是数学?那么仔细思考就能得出结论,本质上在考察数学中的进制问题。举例说明:
假设:总时间 minutesToTest = 60,死亡时间 minutesToDie = 15,pow(x, y) 表示 x 的 y 次方,ceil(x)表示 x 向上取整
当前每只小猪,最多可以喝 times = minutesToTest / minutesToDie = 4 次水
最多可以喝 4 次水,能够携带 base = times + 1 = 5 个的信息量,也就是(便于理解从 0 开始):
(1) 喝 0 号死去,0 号桶水有毒
(2) 喝 1 号死去,1 号桶水有毒
(3) 喝 2 号死去,2 号桶水有毒
(4) 喝 3 号死去,3 号桶水有毒
(5) 喝了上述所有水依然活蹦乱跳,4 号桶水有毒
结论是 1 只小猪最多能够验证 5 桶水中哪只水桶含有***,当 buckets ≤ 5 时,answer = 1
那么 2 只小猪可以验证的范围最多到多少呢?我们把每只小猪携带的信息量看成是 base进制数,2 只小猪的信息量就是 pow(base, 2) = pow(5, 2) = 25,所以当 5 ≤ buckets ≤ 25时,anwser = 2
那么可以得到公式关系:pow(base, ans) ≥ buckets,取对数后即为:ans ≥ log(buckets) / log(base),因为 ans 为整数,所以 ans = ceil(log(buckets) / log(base))
对于1只猪,可以在1h之内最多喝 4次水(60/15),但是可以检验5个桶,如果前四次没死,说明第5个桶有毒。
对于2只猪,现在可以让一只猪一下喝5桶水,如图所示的一只猪喝行的五个,一只猪喝列的五个,这样就可以确定哪个桶有毒。
对于3只猪,就是三维的 5 X 5 X 5 ,可以检测125个桶;
|
|