zoukankan      html  css  js  c++  java
  • 一个面试问题的思考

    问题:

    有1000瓶超级名贵的葡萄酒,其中有1瓶有毒。这种毒药很厉害,哪怕被稀释了1000000倍还是可以毒死人的。但这个毒药一定时间后才会毒发,时长是1个月。为了不浪费这些葡萄酒,有100个壮士决定花5周的时间将毒酒找出,他们只希望最多有10个人牺牲,你需要如何安排才能实现。 -- TopLanguage

    解法一:

    1000瓶酒,人均10瓶那么可以这样把酒分组。
    第一次:1-10,11-20,21-30...991-1000
    第二次:2-11,12-21,22-31...992-1(就是1001循环到1)
    第三次:3-12,13-22,23-32...993-2(就是1002循环到2)
    ...
    第九次:9-18,19-28,29-38...999-8
    第十次:10-19,20-29,30-39...1000-9

    这样每次分组都有100组,对应每个壮士。十次分组,那么每瓶酒都有十个人喝,所以我们观察哪十个壮士毒发,那么就可以他们共同喝了那一瓶酒就是毒酒。
    这个解法一定会有十个壮士毒发,代价大,但是满足要求。

    但是这里没有用到时间。题目中35天时间没有用上

    解法二:

    同样也是分组,同样也是每人认领10瓶,但不一样的是不是一天喝完。
    第一天:1-2,11-12,21-22... 意思第一个人喝1-2,第二个人喝11-12,以此类推
    第二天:3-4,13-14,23-24...
    第三天:5-6,15-16,25-26...
    第四天:7-8,17-18,27-28...
    第五天:9-10,19-20,29-30...
    第五天:每个人都喝下一个人的偶数(或者奇数)瓶
    那么根据壮士毒发的时间就能知道毒酒到底在哪,然后根据最后一天毒发的人确定到底是偶数有毒还是奇数有毒。注意加粗部分,第五天采用了两个操作。

    第一种情况:
    这里假设毒酒在前4天被喝到,那么在30-34天就知道哪两瓶酒有毒,在第35天看上一个区间的人是否毒发就能知道毒酒是在偶数瓶还是奇数瓶。
    第二种情况:
    这里假设毒酒在第5天被喝到,那么在35天才会有人毒发。这里假设第一个壮士 A 毒发了。这个壮士喝了自己的9,10 瓶酒,也喝了下一个人的偶数(奇数)瓶。
    a. 如果下一个人也毒发那么毒酒就在下一个壮士的第偶数(奇数)瓶
    b. 如果下一个人没有毒发那么毒酒就在 A 的第9瓶或者第10瓶里。这时观察 A 前面的壮士是否毒发就能确定,毒酒是第9瓶还是第10瓶。

    这个解法利用了30-35天的时间差最多有两个壮士毒发,最少毒发一个,牺牲会小很多。

  • 相关阅读:
    05 drf源码剖析之认证
    04 drf源码剖析之版本
    03 drf源码剖析之视图
    02 drf源码剖析之快速了解drf
    OA之为用户设置角色和为用户设置权限
    EasyUI之datagrid的使用
    C#之反射
    EasyUI之Layout布局和Tabs页签的使用
    Memcached的使用
    Log4Net的简单使用
  • 原文地址:https://www.cnblogs.com/sinpo828/p/14492633.html
Copyright © 2011-2022 走看看