今天,和一個朋友談論了一個有趣的問題:
有1000個一模一樣的瓶子,其中有999瓶是普通的水,有一瓶是毒葯。任何喝下毒葯的生物都會在一星期之后死亡。現在,你只有10只小白鼠和一星期的時間,如何檢驗出哪個瓶子里有毒葯?
眨看之下,貌似:”有一堆砝碼,有一個不准,最少幾次稱量可以找出這個砝碼?“
但這問題關鍵是:”你只有一次驗證答案的機會!“ 不管你采取什么措施,你只能揭曉答案一次。
我是學計算機的,所以對數字比較敏感。210 = 1024!所以,我先假設有1024個瓶子,其中只有1瓶毒葯。
1. 將1024分成兩個512,即512a和512b。從512a的各瓶中,各取1滴水,給1號小白鼠吃;
2. 將兩個512分別分成兩個256,即,512a分成了256a、256b,並且512b也分成了256a、256b。從兩個256a中,照舊每瓶取一滴,給2號小白鼠吃;
3. 同樣的道理,依次分為4個128a、128b,將a各取一滴,給3號小白鼠吃;
8個64a、64b,將a各取一滴,給4號小白鼠吃;
16個32a、32b,將a各取一滴,給5號小白鼠吃;
32個16a、16b,將a各取一滴,給6號小白鼠吃;
64個8a、8b,將a各取一滴,給7號小白鼠吃;
128個4a、4b,將a各取一滴,給8號小白鼠吃;
256個2a、2b,將a各取一滴,給9號小白鼠吃;
512個1a、1b,將a各取一滴,給10號小白鼠吃;
4. 現在,大功告成,坐等一周后的結果:
若1死,則毒葯在512a中;否則,在512b中;
若2死,則在256a中;否則,在256b中;同時,根據1的結果,可判定這個256來自512a還是512b;
。。。
最后,可以唯一地確定這個”1“來自哪里,也就確定了它是第幾瓶。
若為1000瓶,則也是不斷划分,划分的時候,優先滿足2的整數次冪划分(如1000分為,512a和488b)。划分到后面還有點變化,有興趣的自己探討吧。
我那同學,提出了一種更簡單明了的思路:
1. 將所有瓶子編號,1、2、3、... 、1000;
2. 將所有編號轉換成對應二進制數, 0000000001,0000000010,0000000011,...,1111101000;
3. 給1號小白鼠吃所有二進制數最低位為1的葯,如,1、3、5、7、...
給2號小白鼠吃所有二進制數中,次低位為1的葯,如,2、3、4、6、...
。。。。
給10號小白鼠,吃所有二進制數中,右數第10位為1的瓶子對應的葯,如,512、513、514、...
4. 最后,根據死去的小白鼠就可以推斷出是哪瓶為毒葯,如,第2、4、7、9個小白鼠死了,那么對應的二進制數為0101001010,即,第660瓶為毒葯!
這種問題,很可能成為IT公司的面試題。狹路相逢,我同學那種解法明顯已站在了制高點。汗顏~~~