经典面试题【宝石海盗】
面试题库【老鼠喝水】一、常见题目
五个海盗抢到了100颗宝石,每一颗都一样大小和价值连城。他们决定这么分: 抽签决定自己的号码(1、2、3、4、5)
首先,由1号提出分配方案,然后大家表决,当且仅当超过半数的人同意时,按照他的方案进行分配,否则将被扔进大海喂鲨鱼
如果1号死后,再由2号提出分配方案,然后剩下的4人进行表决,当且仅当超过半数的人同意时,按照他的方案进行分配,否则将被扔入大海喂鲨鱼,依此类推。
条件:每个海盗都是很聪明的人,都能很理智地做出判断,从而做出选择。
问题:第一个海盗提出怎样的分配方案才能使自己的收益最大化?
二、详细思路
1.转换思维
从题目中我们得到已知的条件是:
- 每个海盗都是很聪明的人,都能很理智地做出判断。
- 按照 1、2、3、4、5 号码顺序进行提出分配方案
- 不超过半数的人同意,将被扔进大海喂鲨鱼
2.详细思路
由于每个海盗能做出最理智的判断,那么我们可以从第五号开始逆推他们什么情况可以获得最多的宝石来判断,他们最理智的判断是什么?
当1、2、3、4全部喂鲨鱼时,5 号自己分配:
只剩下 5 号一个人
此时 5 号必得 100 颗宝石
0 0 0 0 100
当1、2、3全部喂鲨鱼时,4号分配:
由于 5 号反对后,4 号将永远不超过半数同意,根据已知条件三,那么 4 号就一定需要去喂鲨鱼。
此时 5 号依然必得 100 颗宝石
0 0 0 0 100
当1、2全部喂鲨鱼时,3号分配:
由于上文知道 4 号在 3 号死后将必定喂鲨鱼,那么 3 号提出的任何分配方案,根据条件一,做出最理智选择,那么 4 号都必须同意 3 号的方案。此时 3 号手握两票,3 + 4 : 5 = 2 :1 的条件必定成立,3 号将会分配给自己 100 颗宝石,此时两票超过半数,条件成立,此时 3 号必得 100 颗宝石。
0 0 100 0 0
当1 号喂鲨鱼时,2号分配:
由于上文知道 3 号在 2 号死后的方案是 0 0 100 0 0,那么此时 4 个人 2 号先需要拉到 2 票 才能保证自己的方案成立。但是 3 号的期望是 100 那么 2 号一定无法拉拢 3 号,由 3 号的分配方案我们可以知道 4 和 5 的 期望都是 0 ,那么 2 号分配给 4、5各1 个宝石就可以进行拉票,此时 3 票到手执行分配方案的条件成立,所以 2 号扣去拉拢的 2 个宝石,此时 2 号可得 98 颗宝石。
0 98 0 1 1
回归题目,当1 号分配:
由于上文知道 2 号在 1 号死后的方案是 0 98 0 1 1,那么此时 5 个人 1 号也需要拉到 2 票 才能保证自己的方案成立。但是 3 号的期望是 98 那么 1 号拉拢 2 号将需要付出 99 个宝石,由条件一 最理智的选择,那么由 2 号的分配方案我们可以知道 3 的 期望都是 0, 而4 和 5 的 期望都是 1 ,那么1 号只分配给 3 号1 个宝石就可以进行拉票,分给4 和 5 中任何一个人 2 个宝石,此时 3 票到手执行分配方案的条件成立,所以 1 号扣去拉拢的 3 个宝石,此时 1 号可得 97 颗宝石。
97 0 1 2 0 或 97 0 1 0 2
此时我们可以得出最终方案为:
97 0 1 2 0 或 97 0 1 0 2 才是满足最理智条件的方案
总结
宝石海盗是一道经典算法面试题,或许从 1 号开始考虑完美方案比较绕,但是将思路从尾理过来,也就是从 5 号的思维,这会让你恍然大悟,算法考察的只是一个思路,我们要学会逆向思维。
希望这个博客能对你有所益处。我是轻王,我为自己代言。