看见个题目,据说是面试题,求大神分析分析 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
aias
V2EX    问与答

看见个题目,据说是面试题,求大神分析分析

  • &nsp;
  •   aias 2017-03-04 21:09:21 +08:00 2116 次点击
    这是一个创建于 3147 天前的主题,其中的信息可能已经有所发展或是发生改变。

    10000 桶酒,其中 1 桶是毒酒; 48 小时后要举行酒会;毒酒喝下去会在之后的第 23-24 小时内毒死人;国王决定用囚犯来试酒,不介意囚犯死多少,只要求用最少的囚犯来测试出哪一桶是毒酒,问最少需要多少囚犯才能保证找出毒酒?

    BTW:

    1. 毒酒喝到就必死,一点点都不行,一个毒酒分子的剂量喝到了都必死好嘛。。。
    2. 大家看清题啊, 2 天内必须找出来,还有 1 天的毒发周期,找不出来国王的酒会没法办了
    3. 死的人是没办法继续验酒的
    4. 必须验出具体是哪一桶酒,其他 9999 桶酒酒会上都会被喝掉,少一桶都不行,不然酒不够,酒会上和酒会后国王请来的贵宾不允许出任何事故
    5. 方案必须能保证到最后一定能验出来,毕竟任何极端情况都有可能,绝对不能靠运气,国王的酒会输不起,只有 2 天时间
    8 条回复    2017-03-30 08:57:31 +08:00
    neosfung
        1
    neosfung  
       2017-03-04 21:33:04 +08:00   1
    构建一个 20*20*25 的三维数组这个三维数组
    找 20+20 个囚犯

    在第 0 小时,取前面的 20*20=400 桶酒
    填在这个 20*20 的表格里
    20 名囚犯负责横排, 20 名囚犯负责竖排
    负责横排的囚犯就喝他所在横排的酒
    负责竖排的囚犯就喝他所在竖排的酒
    每一个小时试下一批
    如果在某个时间段内有囚犯死了,必然是两个囚犯
    这样就可以推测出之前是喝的是哪个时间段的酒,喝的是哪一桶

    综上所述,需要 40 名囚犯,最后死两名囚犯
    fg607
        2
    fg607  
       2017-03-06 13:14:29 +08:00
    一个人间隔一小时喝一桶,因为毒发在 23-24 小时之后, 48 小时内要验出,所以每个人在 24 小时内最多检验 25 桶酒,总共 500 桶,需要 500/25=20 个人。

    但这不一定是最少的答案,但比一楼的少^_^
    fg607
        3
    fg607  
       2017-03-06 13:22:12 +08:00
    搞错了,楼主是 10000 桶酒,不是一个题目-_-#
    fg607
        4
    fg607  
       2017-03-06 14:08:47 +08:00
    一楼的方法很牛逼,但不是最少的,在一楼的基础上可以优化,设置 20*20 人的排列,但最后一列不安排人喝,结果会出现死两个人和死一个人的情况,都可以判断哪一桶有毒,所以最少时 39 人。
    fg607
        5
    fg607  
       2017-03-06 14:42:08 +08:00
    好了,更严谨的来了, C(28,2)+28=406>400,最少 28 人。
    fg607
        6
    fg607  
       2017-03-06 15:49:26 +08:00
    标准答案应该是 C(N,1)+C(N,2)+C(N,3)+........C(N,N)>=400
    neosfung
        7
    neosfung  
       2017-03-17 16:51:46 +08:00
    好吧,再给个可用的答案
    同样,将 10000 桶酒分为 25 组,每组 400 桶
    找 9 个囚犯,每个囚犯按照 1 , 2 , 4 , 8 , 16 , 32 , 64 , 128 , 256 编号
    嗯,到了这个套路,相信程序员都很熟悉了。。。
    beijiaoff
        8
    beijiaoff  
       2017-03-30 08:57:31 +08:00
    @fg607 是谁告诉你标准的。。。
    出题人说下面的方法差不多接近标准了:
    3 个人,因为 25^3>10000

    把酒按 25 进制编码,然后按照编码,例如 xyz 号酒
    在第 x 个小时喂给第一个奴隶
    在第 y 个小时喂给第二个奴隶
    在第 z 个小时喂给第三个奴隶

    然后,看啥时候病发,倒推 xyz ,转成十进制就是第几桶酒了。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5381 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 01:21 PVG 09:21 LAX 18:21 JFK 21:21
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86