美文网首页
IOS 算法(困难篇) ----- 可怜的小猪

IOS 算法(困难篇) ----- 可怜的小猪

作者: ShawnAlex | 来源:发表于2021-04-13 11:54 被阅读0次

有 buckets 桶液体,其中 正好 有一桶含有毒药,其余装的都是水。它们从外观看起来都一样。为了弄清楚哪只水桶含有毒药,你可以喂一些猪喝,通过观察猪是否会死进行判断。不幸的是,你只有 minutesToTest 分钟时间来确定哪桶液体是有毒的。
喂猪的规则如下:
选择若干活猪进行喂养
可以允许小猪同时饮用任意数量的桶中的水,并且该过程不需要时间。
小猪喝完水后,必须有 minutesToDie 分钟的冷却时间。在这段时间里,你只能观察,而不允许继续喂猪。
过了 minutesToDie 分钟后,所有喝到毒药的猪都会死去,其他所有猪都会活下来。
重复这一过程,直到时间用完。
给你桶的数目 buckets ,minutesToDie 和 minutesToTest ,返回在规定时间内判断哪个桶有毒所需的 最小 猪数。

例子:

输入:buckets = 1000, minutesToDie = 15, minutesToTest = 60
输出:5

输入:buckets = 4, minutesToDie = 15, minutesToTest = 15
输出:2

输入:buckets = 4, minutesToDie = 15, minutesToTest = 30
输出:2

解题思路:

这道题代码量不多, 重点考察数学思维

我们以 minutesToDie = 15, minutesToTest = 60 举例

minutesToTest / minutesToDie = 60 / 15 = 4, 可看出规定时间内可测4轮, 那么我们看下1只猪每次1桶水最多可测几桶

1.喝1桶, 0 ~ 15 内GG, 1桶有毒, 否则继续
2.喝2桶, 15 ~ 30 内GG, 2桶有毒, 否则继续
3.喝3桶, 30 ~ 45 内GG, 3桶有毒, 否则继续
4.喝4桶, 45 ~ 60 内GG, 4桶有毒, 否则继续
5.都没有则5桶有毒

那么有规定时间内1猪1桶, 最多测 minutesToTest / minutesToDie + 1 = 5
即: 1只小猪的状态信号为 states = minutesToTest / minutesToDie + 1,这里状态信号是1只小猪测试出的状态(在可测试的次数的范围内)。

我们看下多猪多桶1次最多喝多少

1只猪, 喝1桶, 1次GG, 1桶有毒, 否则2桶有毒, 最多2桶
2只猪, 1号猪和1, 2桶, 2号猪喝2, 3桶
① 仅1猪GG, 则1号桶有毒
② 仅2猪GG, 则3号桶有毒
③ 仅1,2猪GG, 则2号桶有毒
④ 否则4号桶有毒
可看出, 最多4桶
.....

这里主要是便于理解这个交叉的思路,

我们接着看下多猪多桶多次

还是以 minutesToDie = 15, minutesToTest = 60 举例, 状态信号为 states = 5

1只猪, 4次验证, 总共可验证5桶 5^1

(上面已举例)
2只猪, 4次验证, 总共可验证25桶 5^2
这里其实多了个时间差概念

示例图

号猪按行喝, 2号猪按列喝

第一次 1号猪喝1, 2, 3, 4, 5桶, 2号猪喝1, 6, 7, 8, 9
第二次 1号猪喝6, 7, 8, 9, 15桶, 2号猪喝2, 7, 12, 17, 22
......

① 0~15 都GG则1桶有毒
② 0~15 1猪GG, 15~30 2猪GG, 则2桶有毒
③ 0~15 1猪GG, 2猪通过无GG, 则5桶有毒
......
后面同理

.....
最后可得出 n只猪最多可验证 5^n 桶, 即status ^ n
那么我们已知桶总数buckets, 信号 minutesToTest / minutesToDie + 1 = status, 即 status ^ n = buckets 求 n

n>= log_{states}{buckets} (对数运算)

(如果 b = a^n ,即 an 次方等于b ( a > 0a != 1),那么数 n 叫做以 a 为底 b 的对数,记作

n = log_{a}{b} 其中, a 叫做对数的底数, b叫做真数, n 叫做以 a 为底 b 的对数”。)

接下来, 用换底公式, 有


换底公式

n>= log(buckets)/log(states)

留意需要结果需要向上取整, 不能四舍五入(向上取整方法ceil())

代码

    func poorPigs(_ buckets: Int, _ minutesToDie: Int, _ minutesToTest: Int) -> Int {
        let states = minutesToTest / minutesToDie + 1;
        return Int(ceil(log(Double(buckets)) / log(Double(states))));

    }

题目来源:力扣(LeetCode) 感谢力扣爸爸 :)
IOS 算法合集地址

相关文章

  • IOS 算法(困难篇) ----- 可怜的小猪

    有 buckets 桶液体,其中 正好 有一桶含有毒药,其余装的都是水。它们从外观看起来都一样。为了弄清楚哪只水桶...

  • 可怜的小猪。

    小猪妈妈在吃饭的时候,生下一只小猪,然后走了。 爸爸坐在飛机上到云南了!他在草丛中发现这只可怜的小猪。爸爸用一根绳...

  • 可怜的小猪

    小猪妈妈在吃饭的时候,生下一只小猪,然后走了。 爸爸到云南了!在草丛中发现这只可怜的小猪。爸爸用一根绳子邦住小猪的...

  • 可怜的小猪

    小猪妈妈在吃饭的时候,生下一只小猪,然后走了。 爸爸到云南了!在草丛中发现这只可怜的小猪。爸爸用一根绳子邦住小猪的...

  • 可怜的小猪

    来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/poor-p...

  • 2018-12-02

    可怜的小猪……

  • Unicorn

    "噢我的小猪猪,你怎么会那么可爱.""真是可怜的小猪." "可怜?"Ron终于奇...

  • IOS 算法(困难篇) ----- 基本计算器

    给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。 1 <= s.length <= 3 * ...

  • IOS 算法合集

    这里用来总结记录所有算法(大部分Swift) 中级篇IOS 算法(中级篇) ----- 三数之和求解问题[http...

  • iOS 加密算法 CommonCrypto框架①【待补充】

    iOS 加密算法 iOS CommonCrypto框架① iOS 加密算法 iOS CommonCrypto框架②...

网友评论

      本文标题:IOS 算法(困难篇) ----- 可怜的小猪

      本文链接:https://www.haomeiwen.com/subject/biwqlltx.html