首页新闻招聘找找看知识库
  • 回复:50 浏览:4300 2010-03-17 14:45 来自 空杯楠

    N个瓶子里装着一种盐,其中有一瓶是假盐,假盐的特点是溶于水后变色,其他的盐则不变色。现在给你X碗水找出那瓶假盐,则X至少为?

  • 空杯楠
    2010-03-17 14:46 空杯楠
    这是解答一:
    也不知道是否正确,大家来谈谈吧

    听完这道题后,我第一感觉X应该是log2(N)的上界。不过我当时没说出答案,我在想如何证明出来,最后一时没想出来好的简单的证明方法,也错失了这个机会。
    现在证明一下,其实这个思路非常简单。
    假设这N个瓶子分别标号为0、1、2、...、N - 1、N
    用0表示水加入盐后不变色,1表示水加入盐后变色,则X碗水中加入盐后的状态可用X位的二进制来表示。
    易知这状态有2^X种,用一种状态就可以对应假盐的瓶子号,而假盐的瓶子号只有N种。
    现在关键是怎么样往水中加盐使其最后的状态就可以看出唯一的假盐的瓶号。
    先看几个数的二进制表示(我从左往右记,与平时的刚好相反)
    0 0000……
    1 1000……
    2 0100……
    3 1100……
    从这个几个数大家会发现用什么方法呢?
    比如0号状态对应结果是0号瓶是假盐,X个碗状态都不变色,则显然0号瓶盐不加入任何碗中
    1号状态对应结果是1号瓶是假盐,X个碗只有第1个碗变色,则只把1号瓶盐加入第一个碗中
    2号状态对应结果是2号瓶是假盐,X个碗只有第2个碗变色,则只把2号瓶盐加入第一个碗中
    3号状态对应结果是3号瓶是假盐,X个碗只有第1、2个碗变色,则只把2号瓶盐加入第一、二个碗中
    现在给定一个具体的数,N=8,该如何往碗中加盐,从上面的分析中可以我们可以按如下方法加盐
    X = log2(N) = 3
    0 000
    1 100
    2 010
    3 110
    4 001
    5 101
    6 011
    7 111
    则0号瓶盐不加入任何碗中,1号瓶盐只加入第一个碗中,2号瓶盐只加入第二个碗中,3号瓶盐加入第一、二个碗中,4号瓶盐只加入第三个碗中,5号瓶盐加入第一、三个碗中,6号瓶盐加入第二、三个碗中 ,7号瓶盐三个碗中都加入。
    即第一个碗中将加入1、3、5、7号瓶盐
    第二个碗中将加入2、3、5、7号瓶盐
    第三个碗中将加入4、5、6、7号瓶yan
    这样由3个碗中最后的状态就可以知道唯一的假盐的瓶号了。
    N为其他数,方法也跟这个一样,不再赘述~
    第1楼 回到顶楼
  • Motto(Momo)
    2010-03-17 15:58 Motto(Momo)
    我想到的是二分法。
    估计是错的··
    第2楼 回到顶楼
  • 空杯楠
    2010-03-17 16:18 空杯楠
    @Motto(Momo)
    说说看
    第3楼 回到顶楼
  • lnkDel
    2010-03-17 16:22 lnkDel
    很明显是1
    第4楼 回到顶楼
  • 嗷嗷
    2010-03-17 16:37 嗷嗷
    @lnkDel
    没错,一碗就够了。
    加1号瓶的盐,加2号,加3号,看加到第几号瓶变色
    第5楼 回到顶楼
  • 琳琅
    2010-03-17 16:40 琳琅
    折半查找
    第6楼 回到顶楼
  • 吮指原味鸡
    2010-03-17 16:45 吮指原味鸡
    1碗,这种考思维方式的题微软有很多
    第7楼 回到顶楼
  • X.Chen
    2010-03-17 17:04 X.Chen
    是碗水,不是滴水。所以我认为是一碗。
    第8楼 回到顶楼
  • Motto(Momo)
    2010-03-17 17:38 Motto(Momo)
    @X.Chen
    @吮指原味鸡
    @嗷嗷
    @lnkDel
    高手。
    题意理解错误。的确是1碗。
    第9楼 回到顶楼
  • 小寒
    2010-03-17 17:46 小寒
    盐是有溶解度的,所以就算是一碗水也要是超级大的,要不很难出结果的,试想当你把n多的盐放到一小碗水中,那么盐越来越多,可能到后来到假盐的时候,根本就容不进去,哈~~我这个是诡辩~~~~
    第10楼 回到顶楼
  • 吴峰
    2010-03-19 08:32 吴峰
    @小寒
    晕,反过来,把水倒到盐瓶子里好了..
    第11楼 回到顶楼
  • Rouper
    2010-03-19 09:32 Rouper
    哈哈哈,楼主杯具了
    第12楼 回到顶楼
  • 修修
    2010-03-19 09:40 修修
    1碗水。。
    第13楼 回到顶楼
  • 空杯楠
    2010-03-19 09:48 空杯楠
    第14楼 回到顶楼
  • 空杯楠
    2010-03-19 10:03 空杯楠
    @lnkDel
    @嗷嗷
    @琳琅
    @吮指原味鸡
    @X.Chen
    @小寒
    @吴峰
    @Rouper
    @修修
    @Motto(Momo)
    一碗水吗、 我咋拐不过弯来 哈哈

    拿一碗水,在每个盐瓶里面加水,看哪个瓶子变颜色吗?
    第15楼 回到顶楼
  • 绝版色狼
    2010-03-19 11:28 绝版色狼
    一碗水
    第16楼 回到顶楼
  • 空杯楠
    2010-03-19 11:32 空杯楠
    @绝版色狼
    不在多说点什么吗 呵呵
    第17楼 回到顶楼
  • Motto(Momo)
    2010-03-19 11:50 Motto(Momo)
    @空杯楠
    就跟在水里放糖是同一个道理
    第18楼 回到顶楼
  • 空杯楠
    2010-03-19 12:00 空杯楠
    @Motto(Momo)
    拿一碗水,在每个盐瓶里面加水,看哪个瓶子变颜色吗? 这么理解不对么
    第19楼 回到顶楼
  • 绝版色狼
    2010-03-19 12:05 绝版色狼
    @空杯楠
    对啊
    第20楼 回到顶楼
  • 空杯楠
    2010-03-19 13:02 空杯楠
    @绝版色狼
    哦。呵呵
    第21楼 回到顶楼
  • 田景
    2010-03-19 13:35 田景
    一碗足够了。。。
    第22楼 回到顶楼
  • vons
    2010-03-19 15:12 vons
    看题目,还以为是安全加密中的salt...
    第23楼 回到顶楼
  • vons
    2010-03-19 15:15 vons
    @小寒
    恩,所谓的饱和度。
    所以应该只拿一碗水,放盐,蒸馏,如此反复直到测出假的。

    那么为什么不是往盐里加水呢?因为碗的容量是有限的,而N却可以接近于无限。要以无限的反复操作去应付无限的N
    第24楼 回到顶楼
  • asheng
    2010-03-19 15:20 asheng
    一瓶水吧~
    第25楼 回到顶楼
  • 空杯楠
    2010-03-19 15:25 空杯楠
    @vons
    haha 我还以为是往盐里加水呢 学习学习了
    第26楼 回到顶楼
  • vons
    2010-03-19 15:29 vons
    设a=碗的容积,b=融化一粒盐与融化一粒假盐所需的水量的最小公倍数

    x=(n/b)/a
    第27楼 回到顶楼
  • vons
    2010-03-19 15:32 vons
    @空杯楠
    往盐里加水是如上的公式。(眼足够好的理想情况..)
    第28楼 回到顶楼
  • 空杯楠
    2010-03-19 15:44 空杯楠
    @vons
    :) 学习了
    第29楼 回到顶楼
  • 张贝贝
    2010-03-20 15:55 张贝贝
    难道这真是考智力的吗?我怎么感觉是在说数据结构,莫非是我想多了
    第30楼 回到顶楼
  • ITniao
    2010-03-20 17:25 ITniao
    一碗水嘛,运气好一下子拿到假盐,就变色了.
    第31楼 回到顶楼
  • ITniao
    2010-03-20 17:27 ITniao
    或者往盐里面放水撒. 一碗足以..
    第32楼 回到顶楼
  • 空杯楠
    2010-03-20 21:28 空杯楠
    @张贝贝
    说说你数据结构的想法
    第33楼 回到顶楼
  • zdd
    2010-06-28 11:08 zdd
    这可能是一个变种,如果加上时间限制,比如盐溶解的时间是A,而要求你在B(B与A十分接近,但大于A)时间内验证出结果,那就不是一碗水了。而是logN碗了。
    第34楼 回到顶楼
  • FengLang
    2010-06-29 12:12 FengLang
    这些人, 用来面试程序员, 感觉有点过份, 因为有N种答案, 就像偻主那样, 认为他的才正确, 还算成logn碗, 好简单的事情, 不是说只有一种会变色吗? 直接每瓶顺序倒点盐进去, 水变色就是假盐了, 或者打一碗水来倒进盐瓶里, 变色的也是.

    这题和工厂选空的盒子一样, 请了个科学家, 花了几个月, 精准的计算, 花了几千万, 终于做出一款可以选空盒子, 请个农民, 农民只用一台风扇就搞定的事一样.

    第35楼 回到顶楼
  • Mike_2010
    2010-06-29 14:35 Mike_2010
    1碗水不就够了吗


    .....
    第36楼 回到顶楼
  • rgqancy
    2010-07-02 19:23 rgqancy
    @lnkDel
    顶你。不过 0.5也行吧。没说X必须是整数吧。
    第37楼 回到顶楼
  • MaoBisheng
    2010-07-04 10:35 MaoBisheng
    @vons
    设a=碗的容积,b=融化一粒盐与融化一粒假盐所需的水量的最小公倍数
    x=(n/b)/a

    ——这个不对吧,你这算的是最坏的情况下,即加盐是放在最后的那个位置

    假盐是放在第i个位置的概率为1/n
    那么需要的水杯数:
    (1/n)*(1/ab)+(1/n)*(2/ab)+(1/n)*(3/ab)+....+(1/n)*(n/ab)
    =(n+1)/2ab,再向上取整
    第38楼 回到顶楼
  • OK_008
    2010-07-15 07:18 OK_008


    第39楼 回到顶楼
  • 拉拉叟
    2010-07-15 08:37 拉拉叟
    第40楼 回到顶楼
  • assiwe
    2010-07-15 10:57 assiwe
    0碗水, 用唾液试就可以了....
    第41楼 回到顶楼
  • Landon
    2011-08-22 10:50 Landon
    第一反应,一碗
    第42楼 回到顶楼
  • 紫电ZD
    2011-08-27 17:00 紫电ZD
    不用水,唾液
    第43楼 回到顶楼
  • 每当变幻时
    2012-09-06 16:58 每当变幻时
    至少至多1碗呀...
    一次放盐,不是假盐又不会变色,变色的就是假盐嘛..
    这怎么感觉是脑筋急转弯啊,楼主是不是记错题目啦?
    第44楼 回到顶楼
  • dhqcl
    2012-10-28 12:24 dhqcl
    一碗啊
    这是脑经急转弯,不是算法问题
    第45楼 回到顶楼
  • jone_e
    2012-12-13 13:12 jone_e
    第一反映:一碗!
    第46楼 回到顶楼
  • 510w1djj
    2017-10-24 14:55 510w1djj
    楼主的答案棒棒的,但是我严重怀疑这题出的有问题,我一往水里倒盐不就知道它变不变蓝是哪瓶了,我觉得可以改成“发生颜色变化需要20分钟,要在20分钟之内找出假盐(只计算反应时间,不计算往水里加盐的时间)”,而且我去百度面试,面试官直接跟我说,不能把不同瓶的盐混在同一碗水里。。。。。。
    第47楼 回到顶楼
  • 510w1djj
    2017-10-24 14:56 510w1djj
    突然发现这都是10年的帖子了,现在可是17年了啊
    第48楼 回到顶楼
  • 键盘碎了
    2017-12-01 16:17 键盘碎了
    额。。。。你在逗我?一碗水不行?
    第49楼 回到顶楼
  • 键盘碎了
    2017-12-01 16:18 键盘碎了
    我看一碗都用不上,你把事情想复杂了吧
    第50楼 回到顶楼
登录后才能评论,请先登录注册