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