banner
Magneto

Magnetoの小屋

Magneto在區塊鏈上の小屋,讓我們的文章在互聯網上永遠熠熠生輝!!

利用 Python 解決「老鼠喝藥水」問題

前言#

我在互聯網上高強度衝浪的時候,偶然發現了這個問題,終於在經過 OI 大神指點下,在 CSDN 幫助下,想到了解決方法。

題目#

你的面前有 100 瓶打亂了的藥水,其中有且只有一瓶為毒藥。你有 7 隻老鼠,喝了毒藥的老鼠會死去,反之不會。現請你利用這 7 隻老鼠設計一種方案,根據老鼠的死活情況找出毒藥。

假定每隻老鼠可以喝下無限量的藥水,且每瓶藥水不會被喝完。在方案實施的過程中,你無法得知當前的執行情況,也就是說,你不能根據前一隻老鼠的死活決定後續的操作。

困難#

這個問題中,最困難的是,我們需要進行完所有步驟以後,才能得知結果,無法根據前一隻老鼠的死活決定後續操作。

在和同學討論的過程中,大家都偏向於使用二分法,不斷逼近,且不考慮上面的困難,就單論二分法來講,我們很可能在七隻老鼠都死完之後都找不到那杯藥水。

這個時候,以我們目前高中的常規數學方法,已經無法解答這道題了,那怎麼辦?

二進制法#

二進制是計算機的語言,讓我們來粗略了解一下二進制。

我們平時使用的是十進制,即逢 10 進 1,當我們寫到第十個數的時候是 10,而不是別的,就如十六進制第十個數使用了 a 來表示,二進制同理,逢 2 進 1,寫到第二個數時,二進制使用 10 來表示。

001 # 1
002 # 2
011 # 3
100 # 4
101 # 5

#後為十進制數,# 前為二進制數,採用三位數的對齊方法,1 左邊的數如果為 0 則沒有實際意義。

了解了二進制,我們來再次審題,7 隻老鼠,100 瓶藥水,使用 Python 編寫了二進制轉換算法,列出了 1 到 100 所有數的二進制。

x=0
for i in range(0,100):
    x=x+1
    y = x
    b=""
    while(y>=1):
        b=str(num%2)+b
        num=num//2
    print(b)

我們發現,100 的二進制轉化結果 1100100 恰好就是一個七位數,這意味著 100 以前的數其二進制表示形式的數字位數永遠不可能超過七,並且每個十進制數,只對應一個二進制數,正好我們有 7 隻老鼠,我們可以利用這個特性來解決這個問題。

從左到右七個數,每個數對應一隻老鼠,當它對應的那一位數為 1 時,就要喝下這瓶藥水,假如喝第 35 瓶藥水,那麼我們先算出 35 所對應的二進制,並使用七位數對其,那麼第 35 瓶對應的二進制為 0100011,從左到右,第 2 位、第 6 位、第 7 位數為 1,那麼我們讓第 2、6、7 隻老鼠去喝掉它,如果三隻老鼠都死掉了,那麼這一杯藥水就是毒藥,如果沒有死或者沒有死完,那麼就不是毒藥,因為這幾隻老鼠還可能要去喝別的藥水,我們無法判斷。

講解結束,開始實踐

實踐推演#

我們使用 Excel 來進行統計,就是列表。使用 Python 的二進制算法,得到 1-100 的所有二進制數,並導入 Excel。為七隻老鼠編號,使它們喝與之對應的藥水。

我們假定第 84 號藥水有毒,接下來進行推演

image

我們可以看到,當一組中,所有老鼠全部死亡時,才能判斷這組為毒藥,也就是第 85 瓶。

換位思考#

當我寫表格的時候,我發現如果不使用數學思維,我們把它看成生物遺傳,當同時滿足這幾個基因均為顯性基因時,才能夠使得表現型為顯性,但是我們要明白二進制解法是一個關鍵的點,如果沒有二進制,

此文由 Mix Space 同步更新至 xLog 原始鏈接為 https://fmcf.cc/posts/technology/Python-Rat-Poison-Solution

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。