q: 我們有很多瓶無色的液體,其中有一瓶是毒藥,其它都是蒸餾水,實驗的小白鼠喝了以後會在5分鐘後死亡,而喝到蒸餾水的小白鼠則一切正常。現在有5只小白鼠,請問一下,我們用這五隻小白鼠,5分鐘的時間,能夠檢測多少瓶液體的成分?
a: 實際上題目出的不太嚴謹,我們假設總共有n瓶液體,以便下面進行展開。
1. 我們先來看乙個更簡單的情形,假設我們現在只有乙隻小白鼠:
這個時候我們還需要對n進行分類討論:
1.1 如果n==2,小老鼠喝掉其中一瓶,最終死掉,則喝掉的有毒,另外一瓶無毒;反之,***。所以乙隻小白鼠可以確定2瓶;
1.2 如果n==3,小老鼠有2種選擇,要麼喝掉一瓶,要麼喝掉兩瓶。喝掉一瓶死掉,那麼可以確定3瓶,沒死掉則只能確定1瓶;喝掉兩瓶死掉,那麼可以確定1瓶,沒死掉則可確定2瓶。因此綜合來看這個時候只能確定1瓶;
1.3 如果n>=4,這個時候可以確定[n/2](取整)瓶,只需把所有的瓶子分成兩個部分,讓這只小白鼠試喝其中一半,如果最終死掉,則可確定另一半無毒,如果沒死,則可確定所喝的那一半無毒;
2. 現在更進一步,假設我們現在有2只小白鼠:
需要注意到的乙個地方是,兩隻老鼠可以給我們展示出2^2=4種狀態。我們假設小白鼠分別為a, b, 喝完死掉與沒死分別為0,1。四種狀態分別是
a0b0 a1b0 a0b1 a1b1
同樣得,2只老鼠實際上也只能對4瓶水p1, p2, p3,p4產生不同的喝法:
0 0 p1
1 0 p2
0 1 p3
1 1 p4
----------------------
a b
其中1表示喝,0表示不喝。
下面開始展開:
同樣,我們對n進行分類討論,結合上面的討論,如果n<4,那麼兩隻老鼠完全可以把n瓶液體全部檢測出來,***,所以下面的討論從n==4開始:
2.1 如果n==4,那麼
a0b0 --> p1有毒
a1b0 --> p2有毒
a0b1 --> p3有毒
a1b1 --> p4有毒
計算方法可用下面的方法:
1*(0 or 1) null = ?
null 1*(0or 1) = ?
1*(0 or 1) && 1*(0 or 1) = ?
---------------------------------------------
a*(0 or 1) b*(0or 1)
?為1則有毒,為0則無毒,因為n==4的關係,如果3個都沒毒,則剩下的必然就有毒了,所以a0b0-->p1有毒。
2.2 如果n==5,則我們可以將n分成4份(1瓶,1瓶,1瓶,2瓶),類似於2.1&1.2,假設p1,p2,p3,p4分別代表其中的4份。則我們可以確定出3*[n/4]瓶。
2.3 如果n==6,則我們可以將n分成4份(1瓶,1瓶,2瓶,2瓶),類似於2.1&1.2,假設p1,p2,p3,p4分別代表其中的4份。則我們可以確定出2*[n/4]+1*([n/4]+1)瓶。
2.4 如果n==7,則我們可以將n分成4份(1瓶,2瓶,2瓶,2瓶),類似於2.1&1.2,假設p1,p2,p3,p4分別代表其中的4份。則我們可以確定出1*[n/4]+2*([n/4]+1)瓶。
2.5 如果n==8,則我們可以將n分成4份(2瓶,2瓶,2瓶,2瓶),類似於2.1&1.2,假設p1,p2,p3,p4分別代表其中的4份。則我們可以確定出3*[n/4]瓶。
2.6 如果n==4*a+i (i=1,2,3,4), 則可確定3*[n/4]+t (i=1,4-->t=0; i=2-->t=1; i=3-->t=2)
(假設a為任意自然數,下同)
3. 推廣到一般情形,假設有k只小白鼠,那麼:
3.1 n==2^k,則可確定n瓶;
3.2 n==a*2^k+i(i=1,2,3,…,2^k-1,2^k),則可確定
(2^k-1)*[n/2^k]+t (i=1,2^k-->t=0; i=2-->t=1; …; i=2^k-1-->t=2^k-2)
總結一下,利用k只老鼠,至少可檢測出max((2^k-1)*(n/2^k), n)瓶液體。
歡迎批評指正。多說一句,小白鼠還是太無辜了。。
小白鼠排隊
在這裡插入 片總時間限制 1000ms 記憶體限制 65536kb 描述 n只小白鼠 1 n 100 每只鼠頭上戴著一頂有顏色的帽子。現在稱出每只白鼠的重量,要求按照白鼠重量從大到小的順序輸出它們頭上帽子的顏色。帽子的顏色用 red blue 等字串來表示。不同的小白鼠可以戴相同顏色的帽子。白鼠的重...
小白鼠排隊
n只小白鼠 1 n 100 每只鼠頭上戴著一頂有顏色的帽子。現在稱出每只白鼠的重量,要求按照白鼠重量從大到小的順序輸出它們頭上帽子的顏色。帽子的顏色用 red blue 等字串來表示。不同的小白鼠可以戴相同顏色的帽子。白鼠的重量用整數表示。多案例輸入,每個案例的輸入第一行為乙個整數n,表示小白鼠的數...
小白鼠和毒藥
有15個一模一樣的瓶子,其中有14瓶是普通的水,有1瓶是毒藥。任何喝下毒藥的生物都會在一天之後死亡。現在,你只有4只小白鼠和一天的時間,如何檢驗出哪個瓶子裡有毒藥?首先想到的是24 16,思路如下 將15轉換0b1111,從0001到1111有15個數給15個瓶子編號,給4只老鼠編號a b c d,...