posts - 66,  comments - 65,  trackbacks - 0
  版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖。如要转贴,必须注明原文网址

  http://www.cnblogs.com/Colin-Cai/p/7726193.html 

  作者:窗户

  QQ:6679072

  E-mail:6679072@qq.com

  因为网上这道题没有详细思路,我想我还是补个详细思路。这道题目描述是这样的:

  有12个一模一样的球,其中11个重量一模一样,剩下的1个重量和其他的不一样。使用一个无砝码的天平称3次,找出重量不一样的这一个球,以及知道这个球比其他的球重还是轻。

  这个题目似乎很早就出来了,估计有十几年吧,曾以不一样的身份出现在各个帖子里,有的时候号称是微软笔试题,也曾被称为google笔试题,还有说是腾讯笔试题的。至于它真实的出处,我们不必在意。另外还有13个球的版本的,只是只要找出球就行了。倒是这道题的详细解题步骤,这些年来似乎从未看到,于是,今天我就来给个详细的分析步骤。

  虽然用信息论的术语,比如信息墒、信息论下界来描述这个问题会比较规范,不过我想说的更加通俗一点。

  我们知道无砝码的天平每次称量会有三种结果:两边一样重,左边重,右边重。根据组合里的乘法原理,三次天平称量有27种结果,而题目的目的是要区分12(球的数目)*2(重或轻)=24种不同情况。我们给出的称法其实是算法,算法运行的过程中只有遇到每一次称重的不同结果,才会面临着不同的分支,从而计算出不同的结果。于是,我们每一种称量结果,会对应着不同的情况。总共最多有27种称量结果,而只有24种情况需要分辨,如果把这27种称量结果看成编码,把24种情况看成需要分辨的不同信息,那么显然,编码数量是足够的。也就是,是有可能的。这种方法可以用来排除结果,却不可以用来肯定结果,也可以用于过程中,比如过程中对于整个三个称重还剩下n次称重,而需要区分的情况为m种,如果m>3n,也就是编码不够用了,那么表示刚才的称重方法是得到结果,应该被排除。

  任何一次称重,如果两边小球数量不一样多,而如果称出小球少的一方轻于小球多的一方,则无法减少要区分的情况,所以会白白浪费一次称重。从而,每一次称重,左右都是相同的球。

  

  好,准备的差不多了,我们可以开始推算法了,我们给12个球先编号,从1编到12。

  我们先看第一次称重左右各多少个球,如果左右各1~3个球,剩下的球大于多于6个,如果第一次称重为左右一样重,那么要区分的情况大于等于2*6=12种,而剩余的2次称量只能区分9种情况,所以不行;如果左右的球为5~6个,那么如果第一次称重两边不一样种,那么要区分的情况就是10或12种(要么是重的那边有一个球重了,要么是轻的那边有一个球轻了,参与称重的所有球都有可能是要找的球),也无法用剩余的2次称重区分所有的情况。所以,第一次称重只能是左右都是4个球。

  不失一般性,第一次称重左边选择编号1、2、3、4,右边选择编号5、6、7、8。

  

  第一次称重会有三种可能:

  左右一样重;

  左边重于右边;

  右边重于左边。

  前两种情况是对称的,只要考虑左边重于右边就可以了,从而只需要考虑左右一样重、左边重于右边这两种情况即可。

  

  (一)

  先考虑左右一样重,那么要找的球在9、10、11、12中,也就是还存在8种情况。考虑第二次称量。

  如果9、10、11、12都在这一次称量上,那么天平不会平衡,那么两次称量总共有2*3=6种结果(2为重、轻),无法区分8种情况。

  如果第二次称量中9、10、11、12中有2个或2个以上的球未参与称量,那么天平一旦平衡,这些未参与称量的球将有至少4种情况需要通过最后一次称量来决定,那么也是不可能的。

  所以,第二次称量中,9、10、11、12有3个球参与称量,不失一般性,就选9、10、11三个球,9、10、11三个球和1、2、3三个不是目标的球做第二次称重(其实还有一种称法,就是9、10和11、1称,也一样可以分辨出来,这里不讨论)。分三种情况:

  (1) 9、10、11重于1、2、3,那么只有三种可能:9重,10重,11重。第三次称量就拿9和10来比较,如果9重于10,结果就是9重;如果10重于9,结果就是10重;如果9、10一样种,结果就是11重。

  (2) 9、10、11轻于1、2、3,和上面道理一样。

  (3) 9、10、11和1、2、3一样重,那么要找的球就是12。最后一次称量就用12比上任何一个正常的球就知道12是重了还是轻了。

 

  (二)

  再考虑1、2、3、4重于5、6、7、8,那么结果会有8种可能:1重,2重,3重,4重,5轻,6轻,7轻,8轻。8个球都有可能,那么最后一次称重至少要有5个球参与,以防第二次称平之后有超过3种情况,从而最后一次称不出来。我们选择1、2、5和3、6、9称第二次。如果1、2、5重于3、6、9,那么有1重,2重,6轻三种情况;如果1、2、5轻于3、6、9,那么有5轻,3重两种情况;如果1、2、5和3、6、9一样重,那么有4重,7轻,8轻三种情况。

  两重一轻、两轻一重(其实就是前一种反过来,所以只用考虑前一种)很容易一次称出,把两个认为可能重的比较一下重量,如果不平衡,那么重的那个就是要找的球;如果平衡,就是剩下的那一个球。一轻一重就更容易了,拿一个正常的球和其中一个球来比就行了。

 

  从而,问题就这么解决了。其实题目可以再变一下,12个球变成13个球,不过三次称重只可以保证找出不一样的那个球,却未必知道这个球是重还是轻。我们可以分析一下,首先,每次左右球数目都一样,道理同上。第一次选择的球只能是左右都4个,如果是左右大于等于5个,万一不平衡,就有最少10种情况(参与称重的球都有可能),那么2次称重是分辨不出来10种情况,而如果是左右3个以内,于是面临2次称重分辨至少7个不知轻重的球,7>3+3,2次搞不定。第一次称重如果不平衡,那么和上面12个第一称不平衡一样,可以解决。如果平衡,那么就面临着2次称重在5个球中找。如果第二称重有这5个球中4个或4个以上的球参与,那么万一不平衡,那么需要一次称重分辨至少4种情况,不可能解决。如果第二称最多只有2个球参与,那么万一平衡,那么剩余的球(至少3个)需要一次称重称出,这是不可能的。所以第二称有其中3个球参与,左边2个,右边剩下的1个和从刚才8个球中找一个正常的。但万一平衡,意味着还有一次称重要分辨2个球,这种情况下,是存在只知道球不知道轻重的可能,因为2*2>3。

posted on 2017-10-26 20:38 窗户 阅读(...) 评论(...) 编辑 收藏