1. 程式人生 > >小白鼠試毒酒的升級版

小白鼠試毒酒的升級版

昨日參加某大資料公司的筆試,最後一題是:有9瓶酒,其中一瓶有毒,可以使用小白鼠進行試驗,但是毒發需要8小時,問最少需要幾隻小白鼠才可以在16小時內知道哪瓶酒是毒酒。
這道題的原型是一道經典的微軟面試題:最少多少隻小白鼠可以一次判斷出1024(一說是1000)瓶酒中哪瓶是毒酒?
我們首先從這道題的做法開始說起:
可以將1024瓶酒依次編號為0到1023。編號轉為2進製表示。將編號中bit0位置為1的酒取出混合給第一隻小白鼠喝;bit1位置為1的酒取出混合給第二隻小白鼠喝;…….bit9位置為1的酒取出混合給第十隻小白鼠喝。將這十隻小白鼠從右到左依次排開,死了的小白鼠的位置為1,否則為0,就得到10bit的二進位制數,將這個二進位制數轉成十進位制,這就是毒酒的編號。
上面的解法可以得到這樣的結論:使用n

只小白鼠最多可以一次判斷出2n個瓶子中哪瓶是毒酒。
其實更一般的說法應該是:使用n只小白鼠最多可以一次判斷出2n瓶子集合中哪個集合有毒酒。這就是本題答案的關鍵。從最上面的解法中可以看出最後存活m只小白鼠的情況應該有Cmn種,而這類情況對應的酒瓶集合中應該有f(m,t1)瓶酒。f(n,t)表示為使用n只小白鼠,進行t次試驗最多可以判斷多少瓶酒中哪瓶是毒酒。那麼f(n,t)可以表示為:

f(n,t)={nm=0f(m,t1)Cmn,t>12n,t=0n=0
使用動態規劃可以很快速地得到結果。
最後順便提一下,如果沒有試驗次數的限制,答案又是什麼?因為沒有時間限制,只需要使用一隻小白鼠一瓶一瓶試吃就行了,吃了哪瓶死了那瓶就是毒酒。
暫時沒想到解析解,因此無法直接根據瓶數直接得到需要的小白鼠的個數。

相關推薦

毒酒升級

昨日參加某大資料公司的筆試,最後一題是:有9瓶酒,其中一瓶有毒,可以使用小白鼠進行試驗,但是毒發需要8小時,問最少需要幾隻小白鼠才可以在16小時內知道哪瓶酒是毒酒。 這道題的原型是一道經典的微軟面試題:最少多少隻小白鼠可以一次判斷出1024(一說是1000)瓶

毒模擬

""" 1000 個瓶子,其中一瓶是毒藥其餘為水,小白鼠飲用毒藥後會在第二天死亡 最少需要多少隻小白鼠才可以在第二天知道那瓶是毒藥? 採用點陣圖 + 位運算的方式進行狀態判斷,複雜度 O(log2 N ) """ import random bottles =

毒酒問題

這道題有兩種問法,一種是問需要多少隻老鼠才能確定,一種是問要如何安排老鼠的喝法。 第一種問法相對簡單: 1000 瓶無色無味的白酒,其中有一瓶毒酒, 白鼠喝了毒酒一個星期(或一天,無所謂)後會死去。 那麼問你:最少需要多少隻白鼠,可以在最短時間內(一個星期或者一天,反正只能實驗一次)

毒瓶問題

大家應該都聽說過這個老題目:有 1000 個一模一樣的瓶子,其中有 999 瓶是普通的水,有一瓶是毒藥。任何喝下毒藥的生物都會在一星期之後死亡。現在,你只有 10 只小白鼠和一星期的時間,如何檢驗出哪個瓶子裡有毒藥? 這個問題的答案也堪稱經典:把瓶子從 0 到 999 依次

智力題-

轉換為二進位制 題目1: 有16瓶水,其中只有一瓶水有毒,小白鼠喝一滴之後一小時會死。請問最少用() 只小白鼠,在1小時內一定可以找出至少14瓶無毒的水? 答案為3只。 解析: 具體步驟: 將16瓶水兩瓶為一組,組號標為A1-A8,三隻小白

IT第二天

not 一個 繼續 continue 今天 輸出 bre 有一個 感受 今天說說感受吧 已經來了快一周了 實在是蒙圈的厲害 以前學習俄語的 英語一點都不懂 要老命了 好了不說了 下面給大家分享下 今天講解的各大知識點 循環 while 條件:

IT第三天

upper 獲取數據 字典 不可 函數 執行 with val 布爾 今天主要內容 常見的基本數據類型: 1. int 整數 2 bool 布爾. 判斷. if while 3. str 字符串, 一般放小量的數據.

馬斯克,特斯拉首席

夏乙 安妮 問耕 發自 凹非寺量子位 出品 | 公眾號 QbitAI 伊隆·馬斯克,比你想的還要激進。 作為特斯拉CEO,馬斯克經常一邊自己坐在Model S上,一邊召開電話會議。車輛的駕駛交給Autopilot,也就是那個時不時會出次意外的自動駕駛系統。 他這麼做不僅僅是

16瓶藥水一瓶有毒,去測試哪一瓶水有毒?

16瓶藥水一瓶有毒,去小白鼠測試哪一瓶水有毒? 面試的時候有個面試官問我,有16瓶藥水,其中一瓶有毒,一隻小白鼠喝過之後,一天之後會死亡,要求在少於15只小白鼠的情況下判斷出哪一瓶有毒,藥水可以兌在一起,小白鼠也可以喝多瓶藥水?我在面試的時候想,如果1瓶水被2只不同的小白鼠喝掉

演算法筆記 — 排隊

  題目連結:http://www.codeup.cn/problem.php?cid=100000581&pid=5 題目描述 N只小白鼠(1 <= N <= 100),每隻鼠頭上戴著一頂有顏色的帽子。現在稱出每隻白鼠的重量,要求按照白鼠重量從大到小的

MyBatis001-新建spring boot專案

1. 找一個最方便的工具來做,我們來使用idea建立一個springboot工程。 File --> New --> Project --> Spring Initializr 2. 點選 Next,在選擇Dependendes依賴的時候,可以什

MyBatis003-使用註解

1.MyBatis提供了無xml配置的使用方式。 這裡,我們先做一點小小的改動,將dao/BootUserMapper.java 中的@Mapper註解取消,在XXXApplication.java中新增註解: @MapperScan("cn.newtips.bootmy

MyBatis004-問題1為什麼UserMapper是一個介面

為什麼UserMapper.java是一個介面。 我發現這個問題,字面上有點短,但是涉及到的內容有點多。 先簡單來講: 1.我們使用@MapperScan 來找到的這個UserMapper.java。這個註解,不是mybatis.jar裡的,是mybatis-sprin

MyBatis007--mybatis的基本結構

我一直疑惑一個事情,這麼的知識點是不是可以背下來,就像小時候背誦課文那樣。 我試了試,效果很差。 一來,已經不是那個年紀了,現在的思維方式主要是理解為主,忽然大量的背誦很多資訊,大腦自動的就排斥。

牛客網——排隊(桶排序)

題目描述 N只小白鼠(1 <= N <= 100),每隻鼠頭上戴著一頂有顏色的帽子。現在稱出每隻白鼠的重量,要求按照白鼠重量從大到小的順序輸出它們頭上帽子的顏色。帽子的顏色用“red”,“blue”等字串來表示。不同的小白鼠可以戴相同顏色的帽子。白鼠的重量用整數表示。 輸入描

排隊

題目描述 N只小白鼠(1 <= N <= 100),每隻鼠頭上戴著一頂有顏色的帽子。現在稱出每隻白鼠的重量,要求按照白鼠重量從大到小的順序輸出它們頭上帽子的顏色。帽子的顏色用“red”,“blue”等字串來表示。不同的小白鼠可以戴相同顏色的帽子。白鼠的重量用整數表示。 輸入描述: 多案例輸入

【備忘】最新 象學院 機器學習 升級III 視訊教程下載

課程大綱:課時1:機器學習應用實驗手冊第1 章 : 第一週課件資料和視訊        課時2:1.機器學習與數學分析        課時3:視訊-1.機器學習與數學分析        課時4:2.概率論與貝葉斯先驗        課時5:視訊-2.概率論與貝葉斯先驗   

1000瓶試劑,其中一瓶有毒,最少需要多少隻能找出有毒的試劑

思路: 這是一道典型的二分法查詢的演算法題,一般情況下,我們使用的都是序列的二分法,如果這道題沒有時間限制,我們就可以使用序列的二分法找到毒藥,步驟如下: (1)首先,給試劑編號,1~1000 (2)給第

有1000瓶水,其中有一瓶有毒,只要嘗一點帶毒的水24小時後就會死亡至少要多少隻才能在24小時

給1000個瓶分別標上如下標籤(10位長度): 0000000001 (第1瓶) 0000000010 (第2瓶) 0000000011 (第3瓶) ...... 1111101000 (第1000瓶) 從編號最後1位是1的所有的瓶子裡面取出1滴混在一起(比如從

[轉載]喝藥水找毒藥——面試題

本文轉自 原部落格地址 題目:1000 瓶無色無味的藥水,其中有一瓶毒藥,10只小白鼠拿過來做實驗。喝了無毒的藥水第二天沒事兒,喝了有毒的藥水後第二天會死亡。如何在一天之內(第二天)找出這瓶有毒的藥水? 思路:10只小白鼠,喝了藥水之後第二天只有存在和掛掉兩種情況,我們用計算機二進位制裡面的0和1