某面試演算法題 最短時間找出十包粉末中的兩藍粉末。

2022-08-02 05:09:13 字數 3338 閱讀 4201

題目:有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...