1000桶水,其中一桶有毒,猪喝毒水后会在15分钟内死去,想用一个小时找到这桶毒水,至少需要几头猪?具体该如何实现方法讲解
對于此問題,一個思路是通過對問題分解:
首先一個豬在一個小時內的狀態可以分為5種:
一.0分鐘喝水,15分鐘死去
二.15分鐘活著再喝水,30分鐘死去
三.30分鐘活著再喝水,45分鐘死去
四.45分鐘活著再喝水,60分鐘死去
五.60分鐘還活著
對比于一個豬有5個狀態,可以考慮狀態機以及計算機二進制思想:
一個豬一個小時可以表示5個不同桶,兩頭豬可以表示5*5=25個不同的桶……
根據題目總共1000個桶:至少需要多少頭豬的話?
根據幾個豬可以表達1000這個完整的數的狀態:
=3125>1000
所以至少5個豬可以實現這1000頭豬的數值范圍覆蓋。
如果只關心多少個豬的話只看前面就好了,如果感興趣具體實現的一種方法的話可以參考下面的閱讀。
這是在思想的實現,是5頭豬可以實現,但對于實際操作的理解該如何操作那?
把5頭豬按照5進制的數據的排列5號,4號,3號,2號,1號(每個位可以有0,1,2,3,4狀態值,只是對于值為0 的位,任何權值相乘都為0,對于實際的計算出那頭豬沒意義),把1000個桶按照5進制編號如01111=1+5+25+125=156,04444=624等
根據此編碼可以實現1-1000個桶的編碼,然后在前15分鐘內,
可以分別讓1號豬喝1號位為1的桶:00001,00011,00021,00031,00041,00101,00111……等等,
總共1+4+4*5+4*(1+4+4*5)+1*125=250個(在第五位只能取0和1,大于1之后已經超過1000的總桶數)
二號豬喝2號位為1的桶:00010,00011,00012,00013,00014等,類比一號豬,總共是250個個桶
三號豬喝00100,00101,00102,00103,00104等,類比以上,可得共250個桶
四號豬喝01000,01014,00024,00034,00044等,總共250個桶
五號豬只喝10000,10001,10002,10003,10004等,總共的桶數為625桶
總共喝過1625桶水,因為這里面豬喝的桶數是有重疊的,如1號和2號豬都喝過00011即3號桶,但其實前15分鐘并不是所有的桶都喝過,如)02222,03333等,前15分鐘可以根據5頭豬的情況具體情況死還是活來判斷,若只有2號豬死亡,因為只有一桶水有毒多以說明有毒的水在2號位編號為1的水桶中,因此2號豬未喝過的水可以排除(若M桶水中有N桶水都有毒,該問題就變的不一樣,該問題提供大家思考解答),其他4個還活著的豬會繼續喝水試毒,30分鐘時,情況和15分鐘時情況類似,一直到1個小時之后的情況。
第15分鐘到30分鐘,分別重復前15分鐘的過程,活著的豬分別喝對應的位置號碼為2的桶水,情況類似,但5號豬,其實已經不用再喝水了,因為第5位為2已經超過1000個桶了,所以5號豬目前休息,其實在實際動態分析的過程中,可以考慮如果5號位沒有死亡的話,把他進行對剩下的未被喝過的水重新分配給這剩下的豬進行檢驗。不過對于該問題,靜態分析就按照前面對應位喝對應位值為1的水。
重復此過程直到60分鐘,根據5頭豬在5個不同時間段的狀態值(死,活)可以最終計算出有毒的水桶。如下圖:
| ?????????????? 豬的位號 豬的狀態 | 1 | 2 | 3 | 4 | 5 |
| 一 | |||||
| 二 | 1 | 1 | |||
| 三 | 1 | ||||
| 四 | 1 | ||||
| 五 | 1 |
該表中的,豬的位號代表編號1,2 3,4,5的5頭豬,狀態的一二三四五代表其最終的狀態表,每個豬的狀態只能是一二三四五中的一個且必須有一個,如表中?的豬狀態用1表示,如果為該結果可以分析:1號豬檢測出尾碼為2的水中有一個有毒,2號豬檢測第二位3號有一個有毒,依次可得有毒的水為:02432,5進制轉換為十進制:2+3*5+4*25+2*125+0*625=367號,即367號桶是毒水。
同時可以參考信息熵的思路:1000桶水,其中一桶有毒,豬喝毒水后會在15分鐘內死去,想用一個小時找到這桶毒水,至少需要幾頭豬? - 知乎
https://www.zhihu.com/question/60227816/answer/1274071217
update:看到有提問得問題里有問到為何不用位狀態為0 的狀態讓豬去檢測?
這個問題,打算言簡意賅的解釋下,如果是5進制,必然是0.1,2,3,4.前面介紹時主要使用的分別是檢查位數數值為1,2,3,4的桶,實際上如果泛化的操作的話,可以任意選擇0,1,2,3,4中任意4個數字為檢測位來檢測,如0,1,3,4或0,2,3,4等,這些都是可以的,這種想法對于計算機編程上變換也很簡單,各種方法結果殊途同歸。4個位數的值都檢測過之后,必然可以得到另一個數值為的狀態,如對應前面1234四個數值檢測的126(01001)的檢測結果對應的檢測表格結果應該是:
| ?????????????? 豬的位號 豬的狀態 | 1 | 2 | 3 | 4 | 5 |
| 一 | 1 | 1 | |||
| 二 | |||||
| 三 | |||||
| 四 | |||||
| 五 | 1 | 1 | 1 |
因為2,3號豬最終還活著,證明該位數值為1,2,3,4都不在有毒的范圍內,所以該位的只能是0的值的桶。
總結:該方法主要是首先如何全面覆蓋1000個桶的范圍,如何具體實現的方法有很多,該答案只是其中一種方法,該種方法還可以變換,最后只要無遺漏的檢查出來,即實現目的。
?
總結
以上是生活随笔為你收集整理的1000桶水,其中一桶有毒,猪喝毒水后会在15分钟内死去,想用一个小时找到这桶毒水,至少需要几头猪?具体该如何实现方法讲解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#基础与VB基础比较
- 下一篇: VB语言通用基础语句