寻找最大的钻石有多难

寻找最大的钻石有多难

HUST微软技术俱乐部又要招新了,在准备招新工作的时候,我顺便翻阅了一下去年的笔试题,其中能力测试第一题是这样的:

 
  电梯问题——一楼到十楼的每层电梯门口都放着一颗钻石,钻石大小不一。您乘坐电梯从一楼到十楼,每层楼电梯门都会打开一次,只能拿一次钻石,问:怎样才能拿到最大的一颗﹖(提示:没有完美的策略,合理的取舍是解决问题的必要手段)
 
  这是一个经典的面试题,如题所言,这道题没有完美的策略能确保你拿到最大的钻石。我们所认可的答案有很多种。比如1-3层选出大中小的标准,4-6层验证前面的结果,7-9层做出选择,10层保底。或者1-5层确定大中小标准,6-10层选择都可以。首先要正确理解题意,一些过于发散的答案(比如走楼梯,电梯来回)不应该被接受,因为这些答案已经违背了题意,其次是一个细节问题,至少需要选择一颗宝石,哪怕1-9层都错过了第10层再小也要选择,不能空手不取。最重要的是,要能体现出你的策略,要有一个解决问题的思路,尽管它可能不一定很正确。
 
  回到题目本身,到底有没有办法能让你有一个较大的概率得到最大的钻石呢?我们不妨来分析一下。假设按照“丢硬币”的心理,我们随便选一层楼去拿钻石(这也算是一种方案,至少它让我们不必犹豫不决,让我们把责任推给上天)。显然,这种方式我们有10%的概率拿到最大钻石,这概率确实比较小。
 
  还有一种似乎复杂一些的策略是:我们把十层楼分成5+5的两部分,前5层均不拿钻石,通俗的话来说,在前5层,你就是抱着看一看的心理。然后到后5层的时候,你第一次见到比前5层都大的钻石,就拿走那一颗。这种情况下,我们把最大钻石出现之前的所有钻石的最大的那一颗记作b2,只要b2位于前5层,则最后一定能得到最大的钻石。此时,我们计算得到最大钻石的概率为:
p=(1/10)* 1+(1/10)*(5/6)+(1/10)*(5/7)+(1/10)*(5/8)+ (1/10)*(5/9)
  表示最大钻石出现在不同位置上(第6-10层)的时候,b2出现在前5层的概率。
  这样计算出来的概率为37.28%!这可是一个不小的概率了!
 
  但是,还有更有效的办法么?细心的人会发现,我们为什么要将十层楼分成5+5的两部分呢?分成n+(10-n)层会不会有更优的解呢?基于前面的模型,我们很容易得出下面的事实:只要b2出现在前n层,则一定能得到最大的钻石。此时的概率为:
  p=(1/10)[(1+n/(n+1)+n/(n+2)+...+n/9)] --- (1)
  它表示当最大的钻石出现在n+1到第10层的时候,b2出现在前n层的概率。我们令(1)式对应函数f(n),用matlab来可以绘制出这个函数的大致曲线(你也可以用Excel或者其他数学工具):
 
  当n取3的时候(n实际上只能取整数),概率取得最大值为39.87%这个值或许比你想象中要大了许多。也就是说当你对前三层楼的钻石持观望态度,后面一旦遇到比这前三个都大的钻石就立即取出。这样你得到最大钻石的概率为39.87%
 
  我们还可以来看看更为一般的情况,假设这个楼并不止9层,它有X层高,我们希望得出最大概率与X的关系。那么和(1)式同样的道理,拿到最大钻石的概率由下面的式子确定:
 p=1/X[n/n+n/(n+1)+...+n/X] -- (2)
  我们可以使用Matlab大致绘制出p-X的曲线:
 
  可以看到,当X趋近正无穷大的时候,这个概率是趋近0.35到0.4之间的某个数值的(后面我们证明之),通过对(2)求极值可求出该值。令(2)式右边为G(n)为了方便求解,我们假定G(n)是个连续函数。G(n)=n/X[1/n+1/(n+1)+...+1/(X-1)] ,中括号中是一个调和级数的一部分,无法直接用公式求解。不过,当X趋近与无穷大的时候,G(n)可以写成如下形式G(n)=n/X[ln(X-1)-ln(n)] 约等于 n/X[ln(X)-ln(n)]=-(n/X)ln(n/X) --- (3)
 
 令(3)式右边为H(n), 易知H(n)为连续可导的凹函数,一阶导数H‘(n) = - (1+ln(n/X)), 令 H'(n) = 0,得 n=X/e,带入H(n)得H(X/e)=1/e约为0.3679。换句话说,就算再高的楼,只要你策略选择得当,你也能有至少36.79%的概率能拿到最大钻石。
 
  你还有更好的策略吗?欢迎在留言中与我交流;-)

  Freesc
  9月14日

posted on 2009-09-14 14:20  J.D Huang  阅读(6741)  评论(35编辑  收藏  举报