問題1
:1000瓶水中有
1瓶下了毒,老鼠只要喝一點點就會在一周之內死掉,問至少需要多少只老鼠,才能在一周之內找出是哪一瓶水有毒?
(微軟筆試題
)[解析
] 假設有
n只老鼠,則瓶數的上限n = 2 ^ n
。將瓶子的
10進製編號(0 - n-1)改為n位的2進製碼,然後
從左到右:讓第1只老鼠喝所有
編號的2
進製碼中
第1位是
1的瓶子中的水
,第2只老鼠喝所有
編號的2
進製碼中
第2位是
1的瓶子中的水
,……,第n
只老鼠喝所有
編號的2
進製碼中第n
位是1的瓶子中的水。
這裡取n=2示例:
瓶的編號
瓶的編號的
2進製表示
是否餵給第
1只老鼠
(0,不喂;1,喂)
是否餵給第
2只老鼠
(0,不喂;1,喂)000
00101
01210
10311
11這樣,由第n只老鼠一周後的死活情況就可確定毒水瓶的編號的2進製碼的左起第n位:老鼠死,第n位為1;老鼠活,第n位為0。
有毒的瓶
的編號有毒的瓶的編號
的2進製表示第
1只老鼠是否會死
(0,不死;1,死)第2
只老鼠是否會死
(0,不死;1,死)000
00101
01210
10311
11由此可以判斷n瓶水只需
log2 n只老鼠即可找出其中的毒藥瓶。
問題2:
1000瓶水中有
1瓶下了毒,老鼠只要喝一點點就會在一周之內死掉,問至少需要多少只老鼠,才能在
兩周之內找出是哪一瓶水有毒?
[解析]
問題2與問題1的不同之處在於,問題2中
老鼠可以參加兩次實驗
,這樣,每只老鼠就有
死死(第1週死掉)
、生死(第2週死掉)
、生生(第2週後仍然活著)
3種狀態。問題
1中每只老鼠只有生或死
2種狀態,所以對瓶子的編號採用了
2進製,問題2
中每只老鼠有
3種狀態,所以對瓶子的編號應採用
3進製。
假設有n只老鼠,則瓶數的上限n = 3 ^ n
。將瓶子的
10進製編號(0 - n-1)改為n位的3進製碼。
第1次實驗:
從左到右:讓第1只老鼠喝所有
編號的3
進製碼中
第1位是
2的瓶子中的水
,第2只老鼠喝所有
編號的3
進製碼中
第2位是
2的瓶子中的水
,……,第n
只老鼠喝所有
編號的2
進製碼中第n
位是2的瓶子中的水。
這裡取n=2示例:
瓶的編號
瓶的編號的
3進製表示
是否餵給第
1只老鼠
(0,1,不喂;2,喂)
是否餵給第
2只老鼠
(0,1,不喂;2,喂)00
0001
0101
2020
23101
04111
15121
26202
07212
18222
2這樣,由第n只老鼠第1週後的死活情況就可確定毒水瓶的編號的3進製碼的左起第n位是不是2:老鼠死,第n位為2;老鼠活,第n位為0或1。
有毒的瓶
的編號有毒的瓶的編號
的2進製表示第
1只老鼠是否會死
(0,1,不死;2,死)第2
只老鼠是否會死
(0,1,不死;2,死)00
0001
0101
2020
23101
04111
15121
26202
07212
18222
2不妨假設毒水瓶的編號是5,則第1次實驗的結果為第1只老鼠不死,第2只死掉,據此可判斷出毒水瓶的編號的3進製碼的左起第1位為0或1,第2位為2,所以可能的編號為2(02)或5(12)。
第2次實驗:
對於所有還活著的老鼠,
從左到右:讓第1只老鼠喝所有
編號的3
進製碼中
第1位是
1的瓶子中的水
,第2只老鼠喝所有
編號的3
進製碼中
第2位是
1的瓶子中的水
,……,第n
只老鼠喝所有
編號的3
進製碼中第n
位是1的瓶子中的水。
瓶的編號
瓶的編號的
3進製表示
是否餵給第
1只老鼠
(0,不喂;1,喂)20
20512
1這樣,由第n只老鼠第2週後的死活情況就可確定毒水瓶的編號的3進製碼的左起第n位:老鼠死,第n位為1;老鼠活,第n位為0。
有毒的瓶
的編號有毒的瓶的編號
的2進製表示第
1只老鼠是否會死
(0,不死;1,死)20
20512
1問題3
:n瓶水中有1
瓶下了毒,老鼠只要喝一點點就會在一周之內死掉,現在由n只老鼠,問如果要求在第k周結束時找出是哪一瓶水有毒,n的最大值可以取多少?
[解析]
問題3中
老鼠可以參加
k次實驗
,這樣,每只老鼠就有
:第1週死掉,第2週死掉,……第k週死掉
,第k週後仍然活著,共(k+1)
種狀態。所以對瓶子的編號應採用(k+1)進製。
假設有n只老鼠,則瓶數的上限n = (k+1) ^ n
。將瓶子的10進製編號(0 - n-1)改為n位的
(k+1)
進製碼。
第1次實驗:
從左到右:讓第1只老鼠喝所有編號的
(k+1)
進製碼中第1位是
k的瓶子中的水,第2只老鼠喝所有編號的
(k+1)
進製碼中第2位是
k的瓶子中的水,……,第n只老鼠喝所有編號的
(k+1)
進製碼中第n位是
k的瓶子中的水。
這樣,由第n只老鼠第1週後的死活情況就可確定毒水瓶的編號的
(k+1)
進製碼的左起第n位是不是
k:老鼠死,第n位為
k;老鼠活,第n位為0
,1,……,(k-1)中的任意數
。第2次實驗:
對於所有還活著的老鼠,從左到右:讓第1只老鼠喝所有編號的
(k+1)
進製碼中第1位是
(k-1)
的瓶子中的水,第2只老鼠喝所有編號的
(k+1)
進製碼中第2位是
(k-1)
的瓶子中的水,……,第n只老鼠喝所有編號的
(k+1)
進製碼中第n位是
(k-1)
的瓶子中的水。
這樣,由第n只老鼠第2週後的死活情況就可確定毒水瓶的編號的
(k+1)
進製碼的左起第n位是不是
(k-1)
:老鼠死,第n位為
(k-1)
;老鼠活,第n位為0
,1,……,(k-2)中的任意數
。接下來的實驗以此類推,一直進行到第k次實驗為止。
老鼠與毒藥問題
偶然在社群上看到這個問題,看到了程式設計師的回答,饒有興趣,於是查詢了csdn後,終於看懂了。有1000瓶液體 正常,無毒 但是由於工作人員失誤,將毒藥滴到了其中一瓶中,從外觀和氣味上完全無法分辨出哪乙個是被汙染過的,我們只知道這個毒藥的毒發期是7天,實驗室有10只小白鼠,只有7天的時間,如何實驗才...
老鼠與毒藥問題
大家應該都聽說過這個老題目 有 1000 個一模一樣的瓶子,其中有 999 瓶是普通的水,有一瓶是毒藥。任何喝下毒藥的生物都會在一星期之後死亡。現在,你只有 10 只小白鼠和一星期的時間,如何檢驗出哪個瓶子裡有毒藥?這個問題的答案也堪稱經典 把瓶子從 0 到 999 依次編號,然後全部轉換為 10 ...
老鼠與毒藥問題
有1000瓶藥,其中有一瓶有毒,老鼠一旦喝一點毒藥就會在24小時後死亡,問最少要多少只老鼠才能在24小時後知道哪一瓶是有毒的。把所有的數轉換成二進位制,如最大的1000轉化成二進位制為1111101000 將所有第一位為1的取出一些混合在乙個瓶子裡 將所有第二位為1的取出一些混合在乙個瓶子裡 將所有...