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

    1、1000瓶毒药要至少多少只老鼠,假设每只老鼠吃了药之后,如果中毒会24小时内毒发而死,才能找出具体的哪一瓶?

    答案是至少10只,需要将药混合起来,需要喂一轮。

    题解

    位运算,每一只老鼠都可以当做一个二进位,代表0和1,0代表老鼠没事,1代表老鼠死了

    根据2^10=1024,所以至少10个老鼠可以确定1000个瓶子具体哪个瓶子有毒。

    为了更好的表达原理,将题目整体缩小为如何用3只老鼠确定8个瓶子(2^3 = 8)。

    一位表示一个老鼠,0-7表示8个瓶子。例如5号瓶子,对应是101,那就是老鼠1和老鼠3都得吃,4号瓶子对应是100,也就是只让老鼠3吃。

    映射关系:
    000 = 0
    001 = 1
    010 = 2
    011 = 3
    100 = 4
    101 = 5
    110 = 6
    111 = 7
    

    每一位就表示一个老鼠,右侧的0-7表示8个瓶子。

    例如5号瓶子,对应是101,那就是老鼠1和老鼠3都得吃;4号瓶子对应是100,也就是只让老鼠3吃。

    根据这个逻辑:分别将1、3、5、7号瓶子的药混起来给老鼠1吃,2、3、6、7号瓶子的药混起来给老鼠2吃,

    4、5、6、7号瓶子的药混起来给老鼠3吃,哪一只老鼠死了,相应的位置就为1。

    现在对某瓶未知序号的毒药,如果出现了情况是老鼠1死了、老鼠2没死、老鼠3死了,这就是101情况对应5号瓶子,那么就是101=5号瓶子有毒。

    按照这个原理,10个老鼠也就可以确定1000个瓶子了。


    2、明天晚上21:00的宴会需要9瓶酒,酒窖里现有17瓶酒,其中有一瓶混入了慢性毒药,只对人和老鼠有影响,吃了以后,无药可医,但需且仅需24小时发作。现在是晚上19:00,请问至少需要多少只老鼠才能选出宴会用的酒?

    题解

    晚上19点到第二晚21点,还有26小时时间,24小时毒发可以允许还有两个小时可操作,即所有操作要在今晚21点前完成:

    情况一:严格24小时准时毒发而死

    一只老鼠,每隔几分钟就按顺序吃一瓶酒,那到了明天晚上19点开始观察老鼠的死亡时间,就能反推出最初是哪一瓶酒是带毒的了。

    情况二:大约24小时才会毒发而死

    给17瓶酒分别从1编号到17,然后分成两组:

    1组是1-9编号的酒共9瓶,

    2组是10-17编号的酒外加上从1-9编号中的任意一瓶酒,共9瓶,

    则共需要两只老鼠试喝2组中的酒,

    则可能发生的结果为:

    1. 喝1组酒的老鼠死亡,则宴会用2组的9瓶酒

    2. 喝2组酒的老鼠死亡,则宴会用1组的9瓶酒

    3. 2只老鼠都死亡,则说明从1-9中拿出的那瓶酒是毒酒,则宴会使用剩余16瓶中的任意9瓶

    情况二原理就是二分法,哪一组没出事就用那一组。

  • 相关阅读:
    设计模式之开篇(C#语法) 爱拼才会赢
    C#语法糖之第一篇:自动属性&隐式类型 爱拼才会赢
    C#语法糖之第四篇: 扩展方法 爱拼才会赢
    C#中this在扩展方法的应用
    笔记20120215_转义字符_运算符
    Linux基本操作
    SQL创表
    软件测试的概念
    java 线程池
    Redis广播
  • 原文地址:https://www.cnblogs.com/DMingO/p/14404162.html
Copyright © 2011-2022 走看看