題目:有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中的。
此方法類似查表;也像分階段改成分杯子;
。。。這個方法就多了。。。
列舉的思想有列舉杯子變色的種類和粉末的可能兩種方式。
以上分析如有錯誤,歡迎指出~
寫本文時想到的,我舍友強悍的想象力,我強悍的分析力和對比總結力 哈哈哈 配一臉。
修改:法三描述兩杯藍的情況分析不完善,法四有四杯藍的情況,已修改,感謝12樓樓主
海愷指出錯誤;另外新增了一樓樓主對一包藍色的解法。
面試演算法題
前幾天,一好友去筆試,有一題 現在有1000個蘋果,和10個箱子,如何把這1000個蘋果裝在這10個箱子裡,才能使不管任何數量 1 1000 的蘋果,都能一次給出?當時,我們都想,出題這人。今天,在想移位的時候,突然想到了,這絕對是二進位制數的變種。分析 1000個蘋果,最接近1024,轉化為2進製...
面試演算法題
1 直方圖矩形最大值 class solution s.push i return res 2 第n個醜數 class solution return res.back 3 lru cache 最近最少使用頁面置換快取器 class lrucache int get int key void set...
某個面試演算法題
援引某人部落格 有乙個整數n,寫乙個函式f n 返回0到n之間出現的 1 的個數。比如f 13 6,現在f 1 1,問下乙個最大的f n n的n是什麼?writed by chszs public void fn int inputval 1000000 int cntforone 0 long c...