東方花豬
級(jí)別: 網(wǎng)絡(luò)英雄
精華主題: 0
發(fā)帖數(shù)量: 856 個(gè)
工控威望: 6585 點(diǎn)
下載積分: 11836 分
在線時(shí)間: 746(小時(shí))
注冊時(shí)間: 2009-12-17
最后登錄: 2024-11-06
查看東方花豬的 主題 / 回貼
樓主  發(fā)表于: 2021-07-14 13:29
一道有意思的算法題,了解一下,對(duì)擴(kuò)張思路有幫助。

問題描述:
有100個(gè)一模一樣的瓶子,其中99瓶中裝的是普通的水,一瓶是毒藥,水和毒藥只能通過老鼠來分辨,喝下毒藥的老鼠會(huì)在一個(gè)星期后死亡(剛好一個(gè)星期),F(xiàn)在你有一個(gè)星期時(shí)間,請(qǐng)問至少需要多少只老鼠才能確定出哪個(gè)瓶子裝的是毒藥?

我本來想的是用坐標(biāo)的方式來確定哪一瓶是毒藥:
1、擺成2x50,4x25,5x20,10x10的方陣
2、每行都放一只老鼠,然后讓老鼠把這行水都喝一口
3、每列放一只老鼠,然后讓老鼠把這列水都喝一口
4、一周后測試每一行和測試每一列的老鼠中都會(huì)有一只死亡,通過死亡的老鼠就可以判斷毒藥的坐標(biāo)啦
5、需要的老鼠數(shù)量=方陣的長度+寬度
   所以10x10的方陣最合適,需要老鼠20只
6、后來又想了想,為什么不建一個(gè)三維的坐標(biāo)系呢,經(jīng)計(jì)算4x5x5的坐標(biāo)系最合適,所需老鼠=4+5+5=14只

最后看了其他解題方式之后,了解到這是一個(gè)二級(jí)制問題,用七只老鼠即可解決
這個(gè)解體思路,非常巧妙。

我們知道2的10次放等于1024,那么通過把瓶子編成二進(jìn)制,同時(shí)把老鼠變成二進(jìn)制的位值就可以分辨到底哪瓶水是毒藥

1.利用二進(jìn)制來做,最少的老鼠數(shù)量就是計(jì)算2的多少次方大于等于瓶子數(shù)量,例如本題為7(2的7次方為128,大于100)。對(duì)100瓶進(jìn)行二進(jìn)制編碼,這樣可以排列出1xxxxxx,x1xxxxxx,...,xxxxxx1這樣的七組序列。如第一瓶藥水編碼為0000001,第五瓶藥水編碼為0000101,第一百瓶藥水的編碼是1100100.

2.把老鼠分辨編成1-10號(hào),分別對(duì)應(yīng)二進(jìn)制的第1位,第2位.....第10位

3.根據(jù)每瓶水的二進(jìn)制代碼給老鼠喝水,該位值為1就給該位值的老鼠喝,為0就不喝,比如,第一瓶藥水編號(hào)為0000000001,就只給1號(hào)老鼠喝,第84瓶,編號(hào)是1010100 ,就給3號(hào),5號(hào),7號(hào)老鼠喝

4.1星期后,看哪些老鼠死了,然后死的老鼠位為1,沒死的老鼠位為0,組成二進(jìn)制數(shù),該數(shù)對(duì)應(yīng)的瓶子編號(hào)就是有毒的編號(hào)。
本帖最近評(píng)分記錄:
  • 下載積分:+2(windstorm) 好貼好貼!
  • 下載積分:+5(bogegongkong) 感謝分享!
  • 拆二代
    山河已秋
    級(jí)別: 探索解密
    精華主題: 0
    發(fā)帖數(shù)量: 57 個(gè)
    工控威望: 149 點(diǎn)
    下載積分: 2744 分
    在線時(shí)間: 161(小時(shí))
    注冊時(shí)間: 2017-06-17
    最后登錄: 2024-11-06
    查看山河已秋的 主題 / 回貼
    1樓  發(fā)表于: 2021-11-15 17:23
    想法真的不錯(cuò)