• 某面试算法题_最短时间找出十包粉末中的两蓝粉末。


    题目:有4个杯子,10包粉末,其中有2包溶于水变蓝,其余无色,粉末溶于水2min才能显现颜色。求找出两包蓝色粉末的最短时间。假设水和粉末用不完。

    解:以下给出四种解法,标记10包粉末为(1,2 ... ) 杯子为[1,2,3,4]
    首先我想会不会是有某种算法,dp 二分。。 

    法一:第一趟:[12,34,56,78]  

        每个杯子分别放两包加水融化,剩下两包不管。可能的情况:

      (1)0个杯子变色,说明剩下两包就是蓝粉末

      (2)1个杯子变色,则蓝粉末在这个杯子两包和未融化的两包其中两包,第二趟四包融化一定可以找到

      (3)2个杯子变色,则在这两个杯子的四包粉末中,第二趟可找到

    法二: 舍友wan(3) ting(2)君想的

      第一趟:[123;456;789;10]

     (1)1个杯子变色,只能在是杯子1-3变色,蓝粉在三种颜色取两个。第二趟可找到

     (2)2个杯子变色,

        - 如果是1/2/3 + 4 变色,则下一趟找1/2/3即可。

        - 如果是123取二,假设是杯1和杯2,则分别在123取1和456取1,第二趟放置[14;25;36;15],分析关系:杯子14有联系,24有联系。

             a. 杯1变色而杯4不变则

    法三:从法一和法二来尝试的:

      第一趟:[1234; 3456; 5678;78910]

      连续4包,相邻两包有联系,12,23,34,所谓有联系指有两杯子放了相同的粉末

     (1)1杯子蓝,则一定是杯1的12或杯4的9 10,2会引起13蓝,3同理。

     (2)2杯子蓝,则有C(2,4)=6种组合。

       1. 杯12蓝,则一定是1 2 3 4,因为粉末56会引起杯3蓝,第二趟可检测出;杯34蓝同理,第二趟检测7 8 9 10

         2. 杯13蓝,则一定是1 2,因为粉末56/78会引起杯2/4蓝,第二趟可检测出;杯24蓝同理,第二趟检测9 10

         3. 杯14蓝,则一定是1 2 9 10,因为34/78会引起2/3变蓝;第二趟在四包中观察即可

         4. 杯23蓝,则一定是5 6,因为粉末34/78会引起杯1/4变蓝

         

     (3)3杯子蓝,则一定是杯子123或456蓝。

         分析123蓝,如果1/2蓝,则5/6一定蓝(4种),二者有依赖,3/4和9/10同理(4种)。答案有8种可能。

         第二趟:[15; 26; 39; 410]

         如果只有一个杯子蓝了,以杯1_15为例,则答案是15,如果两个杯子蓝了,如1_15蓝,则另一蓝杯一定是包含6的2_26。

         以上是枚举时感觉有联系分析出的。

       

    法四:面试官给的,我分析了下,好奇妙。这个方法我在想出法一就在看了,没找出规律,看法二觉得很像,到法三终于豁然开朗。

      第一趟:[1234; 2567; 3689; 47910

      每个杯子只有一个独立的,每杯都与另外三杯有一个共同粉末(而且一包粉最多只能放在俩杯里),放置方法:1234放在杯子1,234分别放在杯234,567放在杯子2,67分别放杯子34...

      (1)不可能只有一个杯子蓝,除了1 10,每包粉末都放在两个杯子里。

      (2)两个杯子蓝: 则只能是这两个杯子共有而其他两个杯子无联系的。第一个蓝杯中有两包ab与两个非蓝杯有联系,另一蓝杯中有两包cd与两个非蓝杯有关系。abcd排除后剩下3包粉末。例如杯子12_[1234;2567]蓝,则可能是125

      (3)三个杯子蓝,则可以排除非蓝杯的四种粉末剩下六种可能;一定有一包是这三个蓝杯中两个杯子的共同颜色+另一个杯子与非蓝杯不同的颜色,比如杯12共同_2+杯3_368,或3+256,或6+123。

             注意到粉末158是独立的,即如1蓝则6一定蓝,去掉这三个的就是(2_36,3+26,6+23),则只需检测236即可,为便于理解重写为[6,3,21,5,8; 23,26,36] 。情况分析:

             - 如果出现一蓝杯(只有2/3/6),则和对应的8/5/1组成两包即使蓝色粉末

             - 如果两蓝杯(23,26,36)就是答案

       (4)四个杯子蓝,则每包蓝粉都会放入两个杯子,粉末158 10放在一个杯子里,粉末2/3/4/6/7/9放在杯12,13,14,23,24,34里,互补的是:杯子[粉末] 12-34[29] 13-24[37] 14-23[46],也就是说,如果粉末2蓝,则粉末9蓝,所以只要检测2即可。则检测三种粉末比如[2;3;4;]即可知道哪两包是蓝色的。

       我突然觉得这是个(排列)组合问题??

    法五: ...  

     ----------------------------------------------------------------------------

    概率优化

    @海恺 指出用法二改为[123,456,78,910],它的时间均值为2*2/45+4*43/45 < 4; 其他方法也可以类似。。

    ------------------------------------------------------------------------------

    如果只有一包蓝色粉末?

    法一:本思路由一楼楼主 kowalski 给出;

       用4bit二进制给10包粉末编码,0000~1001,对所有粉末,如果某一bit为1,则放入对应bit的杯里,比如5(0101)放入杯24中。

       最终变色结果对应的就是蓝色的粉末,分析:杯子变蓝说明杯中有蓝粉末,粉末对应bit为1未变蓝说明粉末对应位为0;

       然而对于两包蓝色以上不能一次性检测出,比如0111和000~0110中任意一包的结果都是0111(杯子2-4蓝);因为杯子变蓝可能是由两包引起也可能是1包引起的。

    法二:类似二分法,[12345;12+67;45+910;4+9]  

        杯1:1~5|6~10 检查其中之一即可;

        杯2:12|345,检查12即可知道345;

        杯3:1|34,如果杯2检查出示在12则杯3的1是检查是在1还是2,则3杯终止,如果是345则杯3检查是34还是5

        杯4:4,如果杯3检测出34则这是判断是3还是4;

        1~5和6~10在杯1对称而且互不干扰,所以杯2-4中同样放置6~10中的。

       此方法类似查表;也像分阶段改成分杯子;

    。。。这个方法就多了。。。

    --------------------------------------------------------------------------------

    枚举的思想有枚举杯子变色的种类和粉末的可能两种方式。

    以上分析如有错误,欢迎指出~

    写本文时想到的,我舍友强悍的想象力,我强悍的分析力和对比总结力 哈哈哈 配一脸。

    APP : 自由选择一个二维码然后识别图中二维码。考虑分享wifi给朋友,自己想看里面的内容不行。微信里有长按识别二维码的怎么做到的呢?? 能识别任何二维码吗?是因为输入的格式还是??

    -----------------------------------------------------------------------------------

    修改:法三描述两杯蓝的情况分析不完善,法四有四杯蓝的情况,已修改,感谢12楼楼主 海恺 指出错误;另外添加了一楼楼主对一包蓝色的解法。

  • 相关阅读:
    spring MVC配置详解
    使用JDBC连接各种数据库
    Linux Shell常用shell命令
    IOS返回go(-1)
    NFS客户端挂载
    oracle常用函数
    支付宝手机网站支付流程(Node实现)
    SQL中的case when then else end用法
    mysql
    socket
  • 原文地址:https://www.cnblogs.com/tinyork/p/5221639.html
Copyright © 2020-2023  润新知