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

题目:有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楼楼主 海恺 指出错误;另外添加了一楼楼主对一包蓝色的解法。

 

posted @ 2016-02-26 19:47  y丫t  阅读(1389)  评论(25编辑  收藏  举报