使用並行二分法解決1000瓶酒找毒酒問題

2021-10-25 04:42:05 字數 1889 閱讀 8325

從1000瓶酒中找出1瓶毒酒是一道著名的面試題,原題如下:某酒主人要宴請客人,他共有1000瓶酒,其中1瓶有毒。一旦喝了毒酒後,會在一天後發作,現在如果我們用小白鼠進行檢測,問一天內最少需要多少只小白鼠才可以檢測出哪瓶有毒?

此題的常規思路是10只老鼠按從左到右的順序一字排好,每桶酒也編上號1到1000,並把編號轉換成二進位制形式(也就是只有0和1的二進位制,但是為了方便,每個二進位制都寫滿10位,不夠十位數的前面添0補滿(比如1100110就寫成0001100110),數字和老鼠的位置一一對應,把酒給相應位置上是1的老鼠喝(每一桶都要喝)。最後按死掉的老鼠是哪幾隻,然後排成二進位制,再轉成十進位制就是第幾桶酒。比如:第70桶酒,70轉換成二進位制就是0001000110,那麼就給第

四、八、九隻老鼠喝。如果最後死掉第

三、七、八隻老鼠,那麼就是0010001100,轉換成十進位制就是140,即140桶酒有毒。理論上這10只老鼠可以檢測1024桶酒。

不過我們也可以選擇使用二分法,當然常規的二分法是無法在一天內解決的,因此我們需要使用並行的二分法,下面是我用python寫的乙個程式

x=

int(

input

('請輸入哪瓶酒有毒:'))

if x%2in

range(1

,2):

print

("1dead"

)else

:print

("1alive"

)if x%4in

range(1

,3):

print

("2dead"

)else

:print

("2alive"

)if x%8in

range(1

,5):

print

("3dead"

)else

:print

("3alive"

)if x%

16in

range(1

,9):

print

("4dead"

)else

:print

("4alive"

)if x%

32in

range(1

,17):

print

("5dead"

)else

:print

("5alive"

)if x%

64in

range(1

,33):

print

("6dead"

)else

:print

("6alive"

)if x%

128in

range(1

,65):

print

("7dead"

)else

:print

("7alive"

)if x%

250in

range(1

,126):

print

("8dead"

)else

:print

("8alive"

)if x%

500in

range(1

,251):

print

("9dead"

)else

:print

("9alive"

)if x%

1000

inrange(1

,501):

print

("10dead"

)else

:print

("10alive"

)

只需要觀察哪些老鼠死去,便可知道是哪瓶酒出了問題。

C 二分法查詢,遞迴二分法

用二分法來求需要查詢的值.includeusing namespace std 查詢key元素是否存在 int findkey const int buf 100 const int ilen,const int key else right left mid 1 查詢失敗 return 1 查詢k...

python二分法查詢 Python 二分法查詢

二分法查詢主要的作用就是查詢元素 lst 1,3,5,7,12,36,68,79 資料集 百萬級資料 num int input 請輸入你要查詢的元素資訊 for el in lst if num el print 存在 break else print 不存在 len lst 0 1 2 3 4 ...

二分法的使用

在看二分查詢之前,需要先強調一下,陣列和函式等價,即f x 等價於num x 都是對映關係,根據乙個x值可以得到唯一乙個函式值。這裡的函式不僅指數學函式,也值自定義的表現為y f x 的函式。二分查詢通常用來處理函式值單調,且容易判斷的問題。例如在有序陣列中查詢值。無論什麼形式的二分,整體思想都是將...