zoukankan      html  css  js  c++  java
  • 智力题

     

    今天的趣题来源于 IBM Ponder This 三月份的谜题。

        大家应该都听说过这个老题目:有 1000 个一模一样的瓶子,其中有 999 瓶是普通的水,有一瓶是毒药。任何喝下毒药的生物都会在一星期之后死亡。现在,你只有 10 只小白鼠和一星期的时间,如何检验出哪个瓶子里有毒药?

        这个问题的答案也堪称经典:把瓶子从 0 到 999 依次编号,然后全部转换为 10 位二进制数。让第一只老鼠喝掉所有二进制数右起第一位是 1 的瓶子,让第二只老鼠喝掉所有二进制数右起第二位是 1 的瓶子,等等。一星期后,如果第一只老鼠死了,就知道毒药瓶子的二进制编号中,右起第一位是 1 ;如果第二只老鼠没死,就知道毒药瓶子的二进制编号中,右起第二位是 0 ……每只老鼠的死活都能确定出 10 位二进制数的其中一位,由此便可知道毒药瓶子的编号了。

        现在,有意思的问题来了:如果你有两个星期的时间(换句话说你可以做两轮实验),为了从 1000 个瓶子中找出毒药,你最少需要几只老鼠?注意,在第一轮实验中死掉的老鼠,就无法继续参与第二次实验了。

        答案:7 只老鼠就足够了。事实上,7 只老鼠足以从 37 = 2187 个瓶子中找出毒药来。首先,把所有瓶子从 0 到 2186 编号,然后全部转换为 7 位三进制数。现在,让第一只老鼠喝掉所有三进制数右起第一位是 2 的瓶子,让第二只老鼠喝掉所有三进制数右起第二位是 2 的瓶子,等等。一星期之后,如果第一只老鼠死了,就知道毒药瓶子的三进制编号中,右起第一位是 2 ;如果第二只老鼠没死,就知道毒药瓶子的三进制编号中,右起第二位不是 2,只可能是 0 或者 1 ……也就是说,每只死掉的老鼠都用自己的生命确定出了,三进制编号中自己负责的那一位是 2 ;但每只活着的老鼠都只能确定,它所负责的那一位不是 2 。于是,问题就归约到了只剩一个星期时的情况。在第二轮实验里,让每只活着的老鼠继续自己未完成的任务,喝掉它负责的那一位是 1 的所有瓶子。再过一星期,毒药瓶子的三进制编号便能全部揭晓了。

        类似地,我们可以证明, n 只小白鼠 t 周的时间可以从 (t+1)^n 个瓶子中检验出毒药来。

     

    有一袋子白沙,一袋子黑沙,各100克。

    从白沙袋子中取5克,扔到黑沙袋子里,搅一搅(不是均匀搅拌)

    然后再从黑沙中取5g,放回到白沙袋子中。 

    问:黑沙袋子中白沙含量高?还是白沙袋子中黑沙含量高?

    答曰:等

    (面试的一个题,回来想了想,应该是一样的吧

     初始:黑袋子 100g 白 100g

     结果:黑袋子  100g:100 *p 白沙       100*(1-p)黑沙

              白袋子   100g:100*p1 黑沙      100*(1-p1)白沙

    p+1-p1=1-P+p1

    导出:p=p1

    其实不用算,想想开始状态和结果状态,相当于部分黑沙和白沙交换,这个量是一样啊

    转自:http://blog.csdn.net/back_to_dream/article/details/6552506

    桌上排列着100个球,两个人轮流拿球装入口袋,能拿到第100个球的人为胜利者,条件是:拿球者每次至少要拿1个但最多不能超过五个,

    问:如果你是先拿球的人,以后不管怎么都能保证你能得到第100个球,你个先拿几个?然后怎么拿?为什么?

    解题思路:

     1、我们不妨逆向推理,如果只剩6个乒乓球,让对方先拿球,你一定能拿到第6个乒乓球。理由是:如果他拿1个,你拿5个;如果他拿 2个,你拿4个;如果他拿3个,你拿3个;如果他拿4个,你拿2个;如果他拿5个,你拿1个。

    2、我们再把100个乒乓球从后向前按组分开,6个乒乓球一组。100不能被6整除,这样就分成17组;第1组4个,后16组每组6个。

    3、这样先把第1组4个拿完,后16组每组都让对方先拿球,自己拿完剩下的。这样你就能拿到第16组的最后一个,即第100个乒乓球。 

    参考答案: 先拿4个,他拿n个,你拿6-n,依此类推,保证你能得到第100个乒乓球。 

    试题扩展: 

    1、假设排列着100个乒乓球,由两个人轮流拿球装入口袋,能拿到第100个乒乓球的人为胜利者。条件是:每次拿球者至少要拿2个,但最多不能超过7个,问:如果你是最先拿球的人,你该拿几个?以后怎么拿就能保证你能得到第100个乒乓球?

    (先拿1个,他拿n个,你拿9-n,依此类推)

    2、假设排列着X个乒乓球,由两个人轮流拿球装入口袋,能拿到第X个乒乓球的人为胜利者。条件是:每次拿球者至少要拿Y个,但最多不能超过Z个,问:如果你是最先拿球的人,你该拿几个?以后怎么拿就能保证你能得到第X个乒乓球?

    (先拿X/(Y+Z)的余数个,他拿n个,你拿(Y+Z)-n,依此类推。当然必须保证X/(Y+Z) 的余数不等于0)

     

    A,B从一堆玻璃球(共100个)里向外拿球,规则如下: 
    (1)A先拿,然后一人一次交替着拿;
    (2)每次只能拿1个或2个或4个; 
    (3)谁拿最后一个球,谁就是最后的失败者; 
    问A,B谁将是失败者?写出你的判断步骤。

    A拿1个,B拿2个,

    A拿2个,B拿4个,

    A拿4个,B拿2个,

    若 B拿球的数目m,前一次A拿球数n,m+n=3或者6

    100 = 31*3 + 1;100=16*6+4;

    100-(3X+6Y)余数为1       //X为A,B拿球一回合总数为3的次数

                                         //Y为A,B拿球一回合总数为6的次数

    最后只剩一个球了,此时,该A拿,所以A必输;

     

    最后一回合:

    最后一个要么1个球,要么4个球,此时,A先拿。

    A要么拿1或4个,立刻失败;要么A拿2个,B则拿1个,还是A失败;

    转自:http://blog.csdn.net/back_to_dream/article/details/7423677

     

  • 相关阅读:
    LayaBox怎么加载不打包的文件
    LayaBox怎么添加背景音乐和音效
    LayaBox的场景切换
    LayaBox怎么在ui页面中取到某个元素对象节点
    LayaBox怎么添加定时循环执行方法播放功能
    LayaBox怎么添加事件
    vue 点击按钮 input框架获取焦点的方法
    JS中的跨域问题
    深入理解javascript之typeof和instanceof
    localStorage(本地存储)使用总结
  • 原文地址:https://www.cnblogs.com/freewater/p/2702081.html
Copyright © 2011-2022 走看看