一、1000瓶毒藥要至少多少隻老鼠,假設每隻老鼠吃了藥以後,若是中毒會24小時內毒發而死,才能找出具體的哪一瓶?code
答案是至少10只,須要將藥混合起來,須要喂一輪。原理
位運算,每一隻老鼠均可以當作一個二進位,表明0和1,0表明老鼠沒事,1表明老鼠死了時間
根據2^10=1024,因此至少10個老鼠能夠肯定1000個瓶子具體哪一個瓶子有毒。co
爲了更好的表達原理,將題目總體縮小爲如何用3只老鼠肯定8個瓶子(2^3 = 8)。位運算
一位表示一個老鼠,0-7表示8個瓶子。例如5號瓶子,對應是101,那就是老鼠1和老鼠3都得吃,4號瓶子對應是100,也就是隻讓老鼠1吃。
映射關係: 000 = 0 001 = 1 010 = 2 011 = 3 100 = 4 101 = 5 110 = 6 111 = 7
每一位就表示一個老鼠,右側的0-7表示8個瓶子。
例如5號瓶子,對應是101,那就是老鼠1和老鼠3都得吃;4號瓶子對應是100,也就是隻讓老鼠3吃。
根據這個邏輯:分別將一、三、五、7號瓶子的藥混起來給老鼠1吃,二、三、六、7號瓶子的藥混起來給老鼠2吃,
四、五、六、7號瓶子的藥混起來給老鼠3吃,哪一隻老鼠死了,相應的位置就爲1。
如今對某瓶未知序號的毒藥,若是出現了狀況是老鼠1死了、老鼠2沒死、老鼠3死了,這就是101狀況對應5號瓶子,那麼就是101=5號瓶子有毒。
按照這個原理,10個老鼠也就能夠肯定1000個瓶子了。
二、明天晚上21:00的宴會須要9瓶酒,酒窖裏現有17瓶酒,其中有一瓶混入了慢性毒藥,只對人和老鼠有影響,吃了之後,無藥可醫,但需且僅需24小時發做。如今是晚上19:00,請問至少須要多少隻老鼠才能選出宴會用的酒?
晚上19點到第二晚21點,還有26小時時間,24小時毒發能夠容許還有兩個小時可操做,即全部操做要在今晚21點前完成:
狀況一:嚴格24小時準時毒發而死
一隻老鼠,每隔幾分鐘就按順序吃一瓶酒,那到了明天晚上19點開始觀察老鼠的死亡時間,就能反推出最初是哪一瓶酒是帶毒的了。
狀況二:大約24小時纔會毒發而死
給17瓶酒分別從1編號到17,而後分紅兩組:
1組是1-9編號的酒共9瓶,
2組是10-17編號的酒外加上從1-9編號中的任意一瓶酒,共9瓶,
則共須要兩隻老鼠試喝2組中的酒,
則可能發生的結果爲:
喝1組酒的老鼠死亡,則宴會用2組的9瓶酒
喝2組酒的老鼠死亡,則宴會用1組的9瓶酒
2只老鼠都死亡,則說明從1-9中拿出的那瓶酒是毒酒,則宴會使用剩餘16瓶中的任意9瓶
狀況二原理就是二分法,哪一組沒出事就用那一組。