Profilo di Wei琛凡FotoBlogElenchiAltro Strumenti Guida

Blog


26/10/2009

寻觅鬼屋!

题:一个小镇上有10000户房子,编号1到10000。身为探险者的你到小镇歇脚,却得知镇上有好几间鬼屋。这下你来劲了,想要到鬼屋里去探个究竟。但镇上的人谈屋变色,都不敢直接告诉你鬼屋的号码。终于,一个小孩壮胆说,鬼屋的号码有个特点,就是小于它号码的所有屋子号码和等于从比它大一号算起的一些连续屋子的号码和。
问:你能在天黑前找到鬼屋吗?
 
答:应该涉及数论的知识,隐约感觉和Fibonacci数列有关系。胆小者慎入 :)
01/09/2009

一线生机(2)

题:100名死囚,100个盒子放在幕布后面,每个盒子里面随机放着一只数字球。数字从1到100,不重复。从1号死囚开始,每名死囚可以选50个盒子,由法官看盒子里球的数字,若其中某球的数字等于死囚的编号,就轮到下一号死囚重复这个过程,一直到100号选完法官判验结果为止。一旦有某一个死囚选的50个盒子不符合上述条件,所有死囚即刻处斩;否则全获释放。没有一名死囚能看到法官判验的过程,只能知道结果(显然)。死囚们之前可以商量制定一个选盒子判验的策略,但一旦1号死囚开始,不能有任何的信息传递。
问:如果你是这100名死囚中的一名,你能为大家找出这一线生机吗?
20/08/2009

一线生机

题:100名死囚,100顶帽子。法官在每顶帽子上随机写上一个 [1, 100] 的整数,数字可以重复。写完之后给每名死囚戴上一顶。每名死囚只能看到其他99名死囚帽子上的数,却不知道自己帽子的数字是多少。现在让死囚们猜自己的数字,并把数字写在纸条上交给法官。法官看这100张纸条,一旦有一名死囚猜中了自己的数字,全部死囚便得释放。
问:如果在戴帽子之后这些死囚不能有任何的信息传递,但在戴帽之前他们能够商量制定一些猜数字策略,你能给他们指出这一线生机吗?
 
答:(多谢Loy Weng同学提供这个更为精妙的解法。)
1. 为这N名死囚编号,从0到N-1。假设第i名死囚帽子上的数字为n_i,且对于任意i,n_i落在[0, N-1]内。
2. 令X=sum_i n_i,Y_j=sum_{i!=j} n_i,则X=Y_j+n_j,或n_j=X-Y_j(对任意j)。
3. 根据余数运算的性质,我们有:X=s*N+x,Y_j=t_j*N+y_j,其中s和t_j为非负整数,x和所有y_j均落在[0, N-1]内。
4. 因为x落在[0, N-1]内,则x必然等于某一位死囚的编号,假设x=k。
5. 由2、3、4,我们有n_k=X-Y_k=(s-t_j)*N+(x-y_j)=(s-t_j)*N+(k-y_j)。若k-y_j为负,则我们有n_k=(s-t_j-1)*N+(N+k-y_j)。
综上,这个必生策略是:每个死囚将其他死囚帽子上的数字求和取余,用自己的编号减掉这个数。若结果小于零,则加上N。这样得到的最终结果便是该死囚要猜的数。根据这个策略,可以保证有且仅有一个死囚猜中自己的数字。
 
解二:(多谢Kai Song同学提供这个极为精妙的解法。注:这个解法只对N=2^m有效)
1. 为这N名死囚编号,从0到N-1。假设第i名死囚帽子上的数字为n_i。下面的运算“xor”表示二进制展开后按位xor。xor_{?}表示对所有满足条件的值做xor。
2. 令Y(n_0, n_1, ... , n_{N-1})= xor_{i in [0,N-1]} n_i,则Y必然落在[0, N-1],也就是说,Y对应某一位死囚的编号,但具体是哪一位死囚不知道。我们假设Y=k。
3. 根据xor的性质,我们有:Y xor n_j = xor_{i!=j} n_j 以及 (Y xor n_j) xor Y = n_j。注意,这对每一位编号为j(j in [0,N-1])的死囚都成立。
4. 对于编号为k的死囚,xor_{i!=k} n_k可知,自己的编号k已知。而我们又假设了Y=k,于是根据上面两式,我们有:xor_{i!=k} n_k xor k = n_k。也就是说,编号为k的死囚必能猜中他的数字。
 
总结:这个策略就是,每位死囚将所有其他死囚的数字二进制展开后按位xor,然后再和他自己的编号xor,便可得到他要猜的数字。这样可以保证有且仅有一位死囚猜中。
01/08/2009

缘分天注定

题:无限大的平面上有100条道路,没有任何两条道路是平行的。每条道路上都有一个人在匀速行走。如果有两个人,他们都和其他的99个人相遇
问:你相信每两个人都有缘分相遇吗?
 
答:
解法一:(刚才走路回家才想到的)
在三维时空中,x、y轴代表这个无限大平面的坐标轴,外加一个时间轴。那么任何一个人的轨迹就是这个三维时空中的一条直线(因为道路是直线,并且人匀速行走)。人X和人Y相遇<=>直线X和直线Y在这三维空间中相交。现假设A、B是题中与其他所有人都相遇的两位,我们来考虑人C和人D。既然直线A和直线B相交,那么它们便决定了一个平面AB。根据题意,直线C和直线A、B均相交,那么
1. 如果相交不在一点,则直线C便在平面AB上。同理直线D也在平面AB上。又根据题意,直线C和直线D不平行,则直线C和直线D必相交,即人C和人D必相遇。
2. 如果相交在一点,则直线C可能与AB不共面,于是直线C和直线D便不一定相交,即人C和人D不一定相遇。
 
解法二:必须画图,但比较容易想到,至少我是先想到这个解法的。与解法一相比较笨拙,此处略。
25/07/2009

毒酒与死囚(2)

 
答:首先来看看问题的复杂度。100坛酒当中有两坛是毒酒,总共有多少种情况呢?显然是C(100,2)。再来考虑解答策略的最小信息量。一个死囚第二天非生即死,只有两种可能,因此每位死囚能传达的信息量只有2。于是答案不言自明,最少需要log_2 C(100,2)=13个死囚。下面是具体实现这一最优策略的方法:
 
我们用“1”代表毒酒坛,“0”代表非毒酒坛。
1. 给每种可能情况编号。假设总共只有5坛酒,则我们可以将11000编号为情况1,10100编号为情况2,等等。
2. 给每位死囚发数字牌。同“毒酒与死囚”,即N号死囚发数字牌2^(N-1)。
3. 根据下表,对于情况M,即让数字牌之和为M的那些死囚都去喝情况M中的两坛酒(用“1”表示)。下表以总共有5坛酒为例:
 
         情况号          情况细节           
            01              11000            1000
            02              10100            0100
            03              10010            1100
            04              10001            0010
            05              01100            1010
            06              01010            0110
            07              01001            1110
            08              00110            0001
            09              00101            1001
            10              00011            1010
 
那么第二天看哪些死囚死了,根据他们的数字牌之和就可以知道对应的那种情况发生了,于是可以确定出毒酒坛。
 
拓展:以上方法可以拓展到总共有N坛酒其中有K坛毒酒。最少需要的囚犯数即 log_2 C(N,K)
22/07/2009

毒酒与死囚

题:国王明晚要大宴宾客,准备了一百坛好酒。可就在万事俱备的时候,家仆前来报告,说有一坛酒被下了毒。这毒一天后才会发作,于是家仆提议说找来一百个死囚,每个死囚尝一坛来确定毒酒坛。国王骂道,朕治理国家那么仁慈有方,怎么会有那么多死囚。你要是不想成为尝酒的一个,就赶快告诉朕最少用多少个死囚。
问:你是家仆,如何确定这最少死囚数?
 
答:二进制是王道。假设我们找了了无限多的死囚,开始给他们发数字牌。1号死囚数字牌是1,2号死囚数字牌是2,3号死囚数字牌是4。。。N号死囚数字牌是2^(n-1)。并且给酒坛也编号,从1到100。由于任何自然数总可以用二进制来表达,因此对编号为M的那坛酒,就让数字和为M的那些死囚来尝。比如说,第5坛酒让1号和3号死囚尝,第11坛酒让1、2、4号死囚尝,等等。第二天看那些死囚死了,把他们的数字加起来便是毒酒坛的编号。于是,最少需要用lg_2 100=7个死囚。
 
拓展:如果有两坛毒酒呢,如何用最少的死囚把他们都找出来?请看下回:毒酒与死囚(2)
07/01/2007

握了几次手

题:男女主人在门口招呼来参加宴会的n对夫婦,大家在一阵寒喧握手后,男主人问所有客人和女主人与别人握过几次手,得到2n+1个不同答案,夫妇之间不握手。
问:女主人握了几次手?
28/12/2006

14场比赛

题:在六月这一整月,一个篮球队每天至少打一场比赛。但一月下来总共不超过45场。
问:在六月中是否存在连续的几天,这个篮球队打的比赛的场数之和正好为14?
15/06/2006

换还是不换,这是一个问题

题:(电视综艺节目)a、b、c三扇门,其中一扇门后有汽车钥匙,要是你押中了,直接把汽车开回家。当你押定了某门后,主持人打开剩下两扇门中的一扇,发现没有钥匙。现在给你一个机会,可以换一扇门押。
问:换还是不换?
 
答:
    一、如果主持人事先并不知道钥匙在哪扇门后,则主持人打开哪扇门和我的选择这些事件之间都是相互独立的,因此不论主持人第一轮打开的是哪个门,到了第二轮,钥匙在剩下两扇门后的概率均等,没有必要换押。
    二、如果主持人事先知道钥匙在某扇门后,则问题就大大不同了。学过概率的工科学生可以轻松的进行如下推导:
    不妨设我们一开始选择a门,而主持人打开b门。设A、B、C分别代表钥匙在a、b、c门后这三个事件,则P(A)=P(B)=P(C)=1/3。设Y代表主持人打开b门这一事件,则根据贝叶斯公式,有
P(A|Y)=P(Y|A)P(A)/P(Y)=[P(Y|A)P(A)]/[P(Y|A)P(A)+P(Y|C)P(C)]
                                   =[1/2*1/3]/[1/2*1/3+1*1/3]
                                   =1/3
P(C|Y)=1-P(A|Y)=1-1/3=2/3
    这个结果说明,在主持人打开b门这个前提之下,钥匙在a门的概率是1/3、在c门的概率是2/3,因此应该改变押宝选择。
01/12/2005

老王的坏脾气

题:司机小王每天要从自己家A出发,到办公室B接开完会的经理老王。把老王送回AB中途的老王家之后,小王再开车回家。老王有个坏脾气,从不等人,如果看到小王还没来,就朝家的方向走去,等碰上小王再上车。今天小王家里有急事,耽搁了半小时出门,结果没想到回到家时只比平时晚到22分钟。
问:今天老王徒步走了多长时间?
 
答:设平时小王出发时刻为0,开车走完AB全程耗时X分,在办公室前等待老王T分,则平时小王回家时刻为2X+T。再设今天小王遇见老王时在路上耗时Y分,则相遇时刻为30+Y。而老王平时从办公室里出来的时刻为X+T,再加上我们需要求的他在路上走的时间z,应等于相遇时刻,即:
30+Y = X+T+z  -------------1
      又小王今天回家的时刻为30+Y+Y,比平时晚22分钟,即:
30+Y+Y = 2X+T+22 ------2
      由1、2式即可得:
z = 26 - T/2
      也就是说,如果平时小王从家里出发,到办公室的时候恰好老王开会出来,则今天老王就徒步走了26分钟。
29/09/2005

工人的报酬

题:你是一位老板,让一位工人为你工作七天。你有一根金条,将全部用来作为工人七天下来的报酬。你必须每天都付给工人报酬,但金条只允许截断两次。
问:如何支付?
 
答:将金条分成三段——1/7、2/7、4/7
      第一天:支付1/7(你手上还有2/7和4/7)
      第二天:收回1/7,支付2/7(你手上还有1/7和4/7)
      第三天:支付1/7(你手上还有4/7)
      第四天:收回1/7和2/7,支付4/7(你手上还有1/7和2/7)
      第五天:支付1/7(你手上还有2/7)
      第六天:收回1/7,支付2/7(你手上还有1/7)
      第七天:支付1/7
11/08/2005

十个关联的组题

题:
1、第一个答案是b的问题是哪个?
a.2 b.3 c.4 d.5 e.6
2、唯一的连续两个具有相同答案的问题是
a.2,3 b.3,4 c.4,5 d.5,6 e.6,7
3、本问题答案和哪个问题答案相同?
a.1 b.2 c.4 d.7 e.6
4、答案是a的问题个数是
a.0 b.1 c.2 d.3 e.4
5、本问题答案和哪个问题的相同?
a.10 b.9 c.8 d.7 e.6
6、答案是a的问题个数和答案是什么的问题个数相同?
a.b b.c c.d d.e e.都不是
7、按字母顺序,本问题答案和下一个问题答案相差几个字母?(a和b相差一个字母)
a.4 b.3 c.2 d.1 e.0
8、答案是元音字母的问题个数是(a,e是元音)
a.2 b.3 c.4 d.5 e.6
9、答案是辅音字母的问题个数是
a.一个质数(1,2,3,5,7) b.一个阶乘数(2,6) c.一个平方数(1,4,9) d.一个立方数(8) e.5的倍数(0,5,10)
10、本题答案是
a.a b.b c.c d.d e.e
 
解:我想不出什么好方法,只能判断第三题选a、b不可能。无奈之下只好用matlab编程求解。得到唯一一组答案是:cdebeedcba。不知道是什么人想出来这么变态的题目!
10/08/2005

必胜牌局

题:甲手上有四张牌——对A对J,乙手上有十六张牌——对4对5对6对7三Q三K单3单2。出牌及大小规则同争上游,2最大3最小,可三带二,不可三带一。现双方均知道对方的牌,且乙先出。
问:乙如何保证必胜? 
 
答:一看这个题目觉得挺容易的,乙拆单张呗,最后能够使得手上有一张单2和某一张单牌其它全对或全三,而甲只有单A,就可以了。但后来发现,并非那么简单。我现在倾向于认为甲必胜。甲只要保留住单A而逼得乙手上有一张单2和另两张单牌(后文称此局面为“三单”),甲就胜,这要容易得多。
      设乙首先出3。甲不要。乙下面有两种选择:1)出单4(或单567,类同)。则甲单A。此时乙不能出单2,否则后面扛不住,因此只有不要。甲出对J,乙必出对Q。至此乙除单2外还有单4、单Q,形成“三单”。2)出单Q(或单K,类同)。则甲不要。下面乙不能再出J之上的大牌了,否则甲只一味不要。于是乙出单4(或单567)……
 
还没完全想清楚
10/07/2005

爱因斯坦难题

      据说是老爱出的题,若能在五分钟之内做出来便是天才。可惜我不是,只有编个程序求解。题目如下:
      有五栋五种颜色的房子,每一位房子的主人国籍都不同。这五位房主每人只喝一种饮料,只抽一种牌子的香烟,只养一种宠物,没有人有相同的宠物,抽相同牌子的香烟,喝相同的饮料。已知如下条件: 
1 英国人住在红房子里
2 瑞典人养了一条狗
3 丹麦人喝茶
4 绿房子在白房子左边
5 绿房子主人喝咖啡
6 抽PALL MALL烟的人养了一只鸟
7 黄房子主人抽DUNHILL烟
8 住在中间那间房子的人喝牛奶
9 挪威人住第一间房子
10 抽混合烟的人住在养猫人的旁边
11 养马人住在DUNHILL烟的人旁边
12 抽BLUE MASTER烟的人喝啤酒
13 德国人抽PRINCE烟
14 挪威人住在蓝房子旁边
15 抽混合烟的人的邻居喝矿泉水
问:谁养鱼?
 
解:
      这个问题实际上最后是要给出一个5*5的矩阵,矩阵的每一行代表一个房间的各种属性。设最后的解矩阵为SM。
 
      首先将各种属性编号如下
   国籍 颜色 饮料 宠物 香烟
1 挪    黄    啤    鱼    D
2 德    蓝    水    猫    P
3 英    红    奶    马    BM   
4 瑞    绿    咖    狗    B
5 丹    白    茶    鸟    PM
(特别的,令“白”=0;“水”=0;“B”=0;“鱼”=0)
 
      然后将上述条件稍加整理,分为几组,并用上述编号分别解释之:
第一组冲突条件:(所谓冲突条件即本组内的条件不能互加)
1、 挪威人住第一间房。                                       10000
2、 挪威人住蓝色房子隔壁。即第二间房是蓝色。      02000
3、 住在中间房子的人喝牛奶。 即第三间房是牛奶。  00300
第二组冲突条件:
1、 英国人住红色房子。                                       33000
2、 瑞典人养狗。                                                40040
3、 丹麦人喝茶。                                                50500
4、 德国人抽Prince香烟。                                     20002
第三组冲突条件:
1、 绿色房子主人喝咖啡。                                    04400
2、 黄色房子主人抽Dunhill香烟。                           01001
3、 抽Blue Master的人喝啤酒。                             00103
剩余条件:
1、 抽Pall Mall香烟的人养鸟。                                00055
2、 绿色房子在白色房子左面。                
         find(SM(:,2)==4)<find(SM(:,2)==0)
3、 抽Blends香烟的人有一个喝水的邻居。 
         abs(find(SM(:,5)==0)-find(SM(:,3)==0))=1
4、 抽Blends香烟的人住在养猫的人隔壁。 
         abs(find(SM(:,5)==0)-find(SM(:,4)==2))=1
5、 养马的人住抽Dunhill香烟的人隔壁。    
         abs(find(SM(:,5)==1)-find(SM(:,4)==3))=1
 
      有了上述准备,下面可以编程了。以下是算法描述。先定义三个矩阵:
% BM = Basic Matrix
BM = [1,0,0,0,0
          0,2,0,0,0
          0,0,3,0,0
          0,0,0,0,0
          0,0,0,0,0];
% CCO = ConflictConditionOne          
CCO = [0,0,0,0,0
           3,3,0,0,0
           4,0,0,4,0
           5,0,5,0,0
           2,0,0,0,2];
      
% CCT = ConflictConditionTwo      
CCT = [0,4,4,0,0
           0,1,0,0,1
           0,0,1,0,3
           0,0,0,0,0
           0,0,0,0,0];
算法主要部分就是分别将CCO和CCT中的行进行排列,然后分别往BM上加。两个矩阵相加的时候必须保证所有的元素对中至少有一个是零。然后再把剩余条件1加到所得矩阵的某一列上。再接着判断或满足其它的剩余条件即可。
 
      剩余条件2有歧义,到底什么是“左边”?若解释为find(SM(:,2)==4)<find(SM(:,2)==0),则答案只有一个:
SM = 1     1     0     2     1
        5     2     5     3     0
        3     3     3     5     5
        4     0     1     4     3
        2     4     4     0     2
即:德国人住绿房子喝咖啡养鱼抽Prince香烟。
 
      若“左边”解释为find(SM(:,2)==4)>find(SM(:,2)==0),则答案有五个:
SM = 1     4     4     5     5
        2     2     0     2     2
        3     3     3     3     0
        5     1     5     0     1
        4     0     1     4     3
       1     1     0     2     1
       5     2     5     3     0
       3     3     3     5     5
       2     4     4     0     2
       4     0     1     4     3
       1     4     4     5     5
       2     2     0     2     2
       4     0     3     4     0
       5     1     5     0     1
       3     3     1     3     3
       1     4     4     0     0
       2     2     0     2     2
       4     1     3     4     1
       3     3     1     3     3
       5     0     5     5     5
       1     4     4     5     5
       2     2     0     2     2
       4     0     3     4     0
       3     3     1     3     3
       5     1     5     0     1
04/07/2005

村子里的病狗

题:
      一个村子,有50个人,每个人有一条狗和一把枪。现在,50条狗中有狗生病,必须铲除之。
      每个人只能看到别人的狗生病,不能看到自己的狗生病。每个人只能杀死自己的狗,不能杀死别人的狗。每个人思维迟钝,稍稍需要动点脑子的判断要花一天时间。村民之间没有任何交流。
      第一天,没有枪声响起
      第二天,也平安无事
      第三天,响起了一阵枪声。
      问:有几条狗生病被打死了(一枪一条狗)
 
答:
      不可能是一条,否则病狗主放眼望去全是好狗,想都不用想,杀了自己那条吧。
      也不可能是两条,否则两个病狗主均只看见一条病狗。而第一天过后没人杀狗,可见病狗不只一条,那就只能是他们自己的狗有病,第二天即杀之。
      如上可作出判断,有三条病狗。

算24

题:1,4,5,6如何通过四则运算得到24?
 
答:4/(1-5/6) 或 6/(5/4-1)
12/06/2005

矩形·剪刀·拼

题:一个24x15的矩形,剪一刀(可以是折线)之后,要拼成一个20x18的矩形。如何做?

这一题我做不出来,只好转载别人的答案:划分为12块(4等分x3等分),每块都是6x5,然后取中间的蛇形折线(长度: 5-6-5-6-5)切开,往上错一位拼起来即可。

09/06/2005

微软面试之疯了的乘客

题:飞机上有100个座位,按顺序从1到100编号。有100个乘客,他们分别拿到了从1号到100号的座位,他们按号码顺序登机并应当对号入座,如果他们发现对应号座位被别人坐了,他会在剩下空的座位随便挑一个坐。现在假如1号乘客疯了 -_-! (其他人没疯),他会在100个座位中随机座一个座位。那么第100人正确坐自己坐位的概率是多少?注意登机是从1到100按顺序的。

第一种思路:将这个问题看成博弈问题。
   
一开始是第1号乘客和第100号乘客对战。
第一种情况:
      若第1号乘客坐1号座位,则第100号乘客必定坐100号座位;若第1号乘客坐100号座位,则第100号乘客必定坐1号座位。此时战局已定,其他乘客不参与对战。
第二种情况:
      若第1号乘客坐了第k(2~99)号座位,则2~(k-1)号乘客不参与对战,不用考虑。而对于第k号乘客来说,此时的第1号座位就相当于是原来的第k号座位,是其“正当”的座位。于是下面的过程又和第1号乘客上飞机时的情形一样。也就是说,这时第1号乘客退出战局,将接力棒交给了第k号乘客,第k号乘客接着疯(^_^),并继续跟第100号乘客死磕。
      以上过程反复,我们可以清楚地看出,其他乘客在跟第100号乘客车轮战,但最终都是“一对一”,即最后只剩两个人在打,于是第100号乘客自始至终的胜算都是50%。
   
第二种思路:数学归纳法(zz)
      考虑更普遍的情况,有n位乘客,n个座位。第1号乘客座任何一个座位的概率为1/n,第n号乘客能坐自己座位的概率为f(n)。那么分别考虑第1号乘客坐每个座位的情况:
1)如果他坐了第1个座位,则第n号乘客能坐第n个座位的概率为1。
2)如果他坐了第k个座位,则2~(k-1)号乘客都能坐自己的座位,到第k号乘客时,由于他的座位被占,他只能在后面的n-k个座位以及第1个座位中任选,此时相当于有n+1-k位乘客,n+1-k个座位而第1号乘客疯了的情况。所以此时第n号乘客能坐自己座位的概率为f(n+1-k)。
3)如果他坐了最后一个座位,则第n号乘客能坐第n个座位的概率为0。 
  
      综上可以得到f(n) = (1/n)[1+f(n-1)+f(n-2)+...+f(2)+f(1)],其中f(1) = 0,f(2) = 1/2。用数学归纳法即可证明f(n) = 1/2.

13个球称三次

题:13个球中一个是坏球,轻重未知。只有一个无刻度天平,最多三次要把坏球找出来。

答: 先将13个球编号1,2,3,4,5,6,7,8,9,A,B,C,D。以下“平”指天平平衡,“轻重”均为前者相对后者而言。

第一次:1234 vs 5678
   平则坏球在9ABCD中。
         第二次:9A vs B1。
            平则坏球在CD  中。
                  第三次:C vs 1。    平则D坏,轻重不知。否则C坏。
            重则坏球在9AB中。
                  第三次:9B vs 12。平则A重,重则9重,轻则B轻。
   重则坏球在1~8中。  
         第二次:1256 vs 739A。
            平则坏球在48  中。
                  第三次:4 vs 1。    平则8坏,轻重不知。否则4坏。
            重则坏球在127中。
                  第三次:17 vs 9A。平则2重,重则1重,轻则7轻。
            轻则坏球在563中。
                  第三次:53 vs 9A。平则6重,重则3重,轻则5轻。