程序员面试智力题之海盗分金币问题

现在一般的软件公司招程序员的时候总喜欢问一些智力题,所以找一些智力题练练是很有必要的。记得之前在笔试某一家软件公司的时候,被问到这样一道题:

从前有五个海盗抢得了100枚金币.他们通过了一个如何确定选用谁的分配方案的安排.即: 
       1.
抽签决定各人的号码(12345);
       2.
先由1号提出分配方案,然后5个人表决.当且仅当超过半数人同意时,方案才算被通过,否则他将被扔入大海喂鲨鱼;
       3.
1号死后,再由2号提方案,4个人表决,当且仅当超过半数同意时,方案才算通过,否则2号同样将被扔入大海喂鲨鱼;
       4.
往下依次类推…… 
 
根据上面的这个故事,现在提出如下的一个问题。即,我们假定每个海盗都是很聪明的人,并且都能够很理智地判断自己的得失,从而做出最佳的选择,那么第一个海盗应当提出怎样的分配方案才能够使自己不被扔入大海喂鲨鱼,而且收益还能达到最大化呢?

这道题是典型的逆向思维的问题,用回推法可以得到答案。过程如下:从后往前推,人数依次增加如果1-3号强盗都喂了鲨鱼,只剩4号和5号的话,5号一定投反对票让4号喂鲨鱼,以独吞全部金币。所以,4号惟有支持3号才能保命。3号知道这一点,就会提(100,0,0)的分配方案,对4号、5号一毛不拔而将全部金币归为已有,因为他知道4号一无所获但还是会投赞成票,再加上自己一票,他的方案即可通过。2号推到3号的方案,就会提出(98011)的方案,即放弃3号,而给予4号和5号各一枚金币。由于该方案对于4号和5号来说比在3号分配时更为有利,他们将支持他而不希望他出局而由3号来分配。这样,2号将拿走98枚金币。2号的方案会被1号所洞悉,1号并将提出(970120)或(970102)的方案,即放弃2号,而给3号一枚金币,同时给4号(或5号)2枚金币。由于1号的这一方案对于3号和4号(或5号)来说,相比2号分配时更优,他们将投1号的赞成票,再加上1号自己的票,1号的方案可获通过,97枚金币可轻松落入囊中。这无疑是1号能够获取最大收益的方案了!

 


你可能感兴趣的:(智力题,面试题)