日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

小鼠试毒问题(二进制)

發布時間:2023/12/9 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 小鼠试毒问题(二进制) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1000桶酒,其中1桶有毒。而一旦吃了,毒性會在1周后發作。問最少需要多少只老鼠可在一周內找出毒酒?

如題。

分析思路:
要用盡可能少的老鼠完成相對大的任務量,要想到把問題進行對數分解
從而不難想到 210=10242^{10}=1024210=1024 這個數量關系。

解法一:
二進制編碼。

首先對1000桶酒按照1~1000進行二進制編碼,因為 2102^{10}210 = 1024 > 1000,因此需要10位二進制。
故只需要取10只老鼠,每只老鼠只喝其對應位數為1的編號的酒。

然后給10只老鼠按以下編碼:
第一只 0000000001
第二只 0000000010
第三只 0000000100

第十只 1000000000

結果舉例:編號為1000100011的酒是毒酒。
則對應喝酒的只有第一只,第二只,第六只,第十只死亡。

故最后可從哪幾只老鼠死亡來判斷毒酒的編號是多少。

通用公式:
N桶酒,老鼠所能表示的狀態數目為M,則需要的老鼠個數為: K=logMNK =log_M{N}K=logM?N

而具體實驗的操作方法為:
1.每種狀態按照 M 進制進行編碼,編碼長度為 K
2.每個老鼠分別去拿自身的 M 中狀態去實驗 N 的 M 進制編碼的某一位
3.所以 K 個老鼠,等同于是 K 長度 M 進制的對應的每一位
4.這樣試驗完后,就確定了每一位上面的數字,找到對應的那種狀態就好。

解法二:
二分法。

具體喝法如下:
第一只:1-500
第二只:1-250,501-750
第三只:1-125,251-375,501-625,751-875

因為2102^{10}210>1000 , 292^{9}29<1000

所以最少需要10只老鼠。


觸類旁通:

初級版問題——每只只能實驗一次

即上題。因為每只老鼠只能實驗一次,所以,每只老鼠身上有兩種狀態一死亡或者存活,而酒中有毒的信息總量為1000,即每桶酒都有可能有毒。

所以需要的編碼長度為:log21000log_ 2 {1000}log2?1000 向上取整得到10

中級版問題一一每只可以實驗多次

10000桶酒,其中1桶是毒酒;48小時后要舉行酒會;毒酒喝下去會在之后的第23-24小時內毒死人(時間確定);國王決定用囚犯來試酒,不介意囚犯死多少,只要求用最少的囚犯來測試出哪一桶是毒酒,問最少需要多少囚犯才能保證找出毒酒?

根據題目要求,對于每個囚犯,是可以實驗24次的,即第0小時喝,然后第1小時再喝,。。。如果第K小時死亡,則是因為第K-24(上取整)小數喝的酒導致的。

這樣的話,每個人就含有了25個狀態,即24小時分別每個小時死亡,外加最后沒有死。

所以需要的囚犯數為 log2510000log_{25}{10000}log25?10000 = 3, 即將10000桶酒按照25進制編碼進行編碼,是一個三位數長度的25進制數。

然后三個人分別第i小時去喝對應位數上編碼為i的所有酒,最后就能確定下來具體喝哪一桶酒。

類似的題:
1000桶水,其中一桶有毒,豬喝毒水后會在15分鐘內死去,想用一個小時找到這桶毒水,至少需要幾頭豬?

解:每頭豬有5種狀態,所以5頭豬即可完成編碼。

高級問題—-不止一桶有毒

不止一桶有毒的情況下,其實非常地復雜。

1000桶水中兩桶有毒,豬喝毒水后會在15分鐘內死去,想用一個小時找到毒水,至少需要幾只豬?如何實現?

因為有兩桶有毒,所以信息量為:N=C10002N = C _ {1000}^{2}N=C10002?種情況。
每只豬身上有5種狀態,所以最低有:log5N=9log_{5}{N}= 9log5?N=9
但是這個只是理論下界,因為豬死亡是不能夠區分出,是被一桶毒水毒死的,還是兩桶毒水。

假設豬死亡的狀態可以區分出來/或者兩種毒水需要混合才能有毒性的話,那么做法是,將這1000桶毒水兩兩混合,一共 N=C10002N = C _ {1000}^{2}N=C10002? 種組合,然后將這些組合按照5進制進行編碼。然后9只豬就可以區分出來了。

而對于這道題來說,不止一桶水有毒的情況,就是先用交叉法再用進制法。
即10只豬每只喝100桶,然后按照死一只還是死兩只進行分開討論。

具體如下:
1.給每只豬喂對應個位數編號的水,這樣第一個15分鐘后肯定最多死兩只豬。

2.1.如果死了兩只豬的話,則同時確定了兩個[100桶水里有一桶水有毒]。問題簡化成兩個[100桶水里有一桶水有毒],45min確定哪兩桶。
將剩下八只豬平均分開,思考可以用幾進制的四位數至少可以表示到100,分別確定這桶水。因為 444^{4}44>100,剛好每只豬剩4種狀態,所以兩步一共需要10只豬。

2.2 如果僅死一只豬的話,問題變成100桶水里兩桶有毒,45min確定哪兩桶。
利用1思路,給剩下的豬每只喂12桶水。

2.2.1若死兩只豬(此時還剩下7只豬),則問題簡化成兩個[12桶水一桶有毒],30min確定。
因為 333^{3}33>12,所以剛好將剩下的豬分成33兩組。

2.2.2若死一只豬(此時還有八只豬),問題變成12桶水里兩桶有毒,30min確定哪兩桶。
利用1思路,給剩下的豬每只喂2桶水。

2.2.2.1若死兩只豬(此時還有六只豬),問題變成兩個[2桶水里一桶有毒],15min確定哪兩桶。

2.2.2.2若死一只豬(此時還有七只豬),問題變成2桶水里兩桶有毒,15min確定哪兩桶。

故而此方法10只是最多的。


可利用 二進制編碼 解法的又一種題目:

500張多米諾骨牌整齊地排成一列,依順序編號為1、2、3…499、500。第一次拿走所有奇數位置上的骨牌,第二次再從剩余骨牌中拿走所有奇數位置上的骨牌,依此類推。請問最后剩下的一張骨牌的編號是多少?

如題。

所有骨牌都可以用一個9位的二進制編碼來標記。

題目中,第1次取牌抽走了所有末位是1的牌,剩余末位為0的牌;第2次抽牌則在第一次剩余的牌中抽走倒數第二位為1的牌…

以此類推,第k次抽牌留下的是形如XXX…X000…0(k個0)的牌。

因此,最后一次抽牌留下的是二進制編碼為100000000,即十進制256的牌。

總結

以上是生活随笔為你收集整理的小鼠试毒问题(二进制)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。