誰能找出毒藥?

2022-07-25 09:06:12 字數 1392 閱讀 9402

今天,和乙個朋友談論了乙個有趣的問題:

有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公司的面試題。狹路相逢,我同學那種解法明顯已站在了制高點。汗顏~~~

看誰能找出bug open函式總是返回 1

總於明白基礎有多重要,今天被乙個open函式把我整死 平時open完之後直接就不管了,一般也不會出現打不開的情況 今天被這個壞習慣打了一巴掌 看誰能找出bug,真的是很基礎的東西 錯誤 int main 第一次執行沒錯,再次執行就一直出錯,總以為是write的問題 正確 int main 如果看出來...

小老鼠 毒藥

我們有很多瓶無色的液體,其中有一瓶是毒藥,其它都是蒸餾水,實驗的小白鼠喝了以後會在5分鐘後死亡,而喝到蒸餾水的小白鼠則一切正常。現在有5只小白鼠,請問一下,我們用這五隻小白鼠,5分鐘的時間,能夠檢測多少瓶液體的成分 c a 5瓶 b 6瓶 c 31瓶 d 32瓶 分析 考察的是二進位制的問題。5個小...

老鼠毒藥問題

問題1 1000瓶水中有 1瓶下了毒,老鼠只要喝一點點就會在一周之內死掉,問至少需要多少只老鼠,才能在一周之內找出是哪一瓶水有毒?微軟筆試題 解析 假設有 n只老鼠,則瓶數的上限n 2 n 將瓶子的 10進製編號 0 n 1 改為n位的2進製碼,然後 從左到右 讓第1只老鼠喝所有 編號的2 進製碼中...