458 可憐的小豬(Java)

2021-09-01 09:24:25 字數 1547 閱讀 4974

問題描述:

有1000只水桶,其中有且只有一桶裝的含有毒藥,其餘裝的都是水。它們從外**起來都一樣。如果小豬喝了毒藥,它會在15分鐘內死去。

問題來了,如果需要你在一小時內,弄清楚哪只水桶含有毒藥,你最少需要多少只豬?

回答這個問題,並為下列的高階問題編寫乙個通用演算法。

高階:假設有 n 只水桶,豬飲水中毒後會在 m 分鐘內死亡,你需要多少豬(x)就能在 p 分鐘內找出「有毒」水桶?n只水桶裡有且僅有乙隻有毒的桶。

問題解析:

舉個例子簡化題目意思:

假設我們有 2 頭豬,毒需要15分鐘才能殺死豬,我們總共有60分鐘。那麼,用下列方式,我們能至多從25個桶中找到毒水。 把桶放置成 5×5 的方形:

1  2  3  4  5

6 7 8 9 10

11 12 13 14 15

16 17 18 19 20

21 22 23 24 25

使用一頭豬來找毒水的行數(讓它喝下桶 1, 2, 3, 4, 5, 裡的水,等15分鐘;讓它喝下桶 6, 7, 8, 9, 10, 裡的水,等15分鐘…)。使用另一頭豬來找毒水的列數(讓它喝下桶 1, 6, 11, 16, 21, 裡的水,等15分鐘;讓它喝下桶 2, 7, 12, 17, 22, 裡的水,等15分鐘…)。每乙個pig測一維,然後利用行列相交就可以找出有毒的桶。

擁有60分鐘,每次毒水測試需要15分鐘,意味著我們可以進行4次測試。從 0min 開始第一波測試,第15min 出 0 的結果並進行第二波測試,第 30min 出15 的結果並進行第三波測試,第 45min 出 30 的結果並進行第4波測試。第 60min 出 45 的結果。如果 行豬 在第三次測試中死亡,那麼毒水就在第3行。如果 列豬 在4次測試中都沒死,那麼毒水在它沒喝的第5列中。(這就是為什麼只能做4波測試,卻能夠測試5行/列)。

如果有3頭豬,可以用 5×5×5 正方體,使用一頭豬來測試乙個維度:豬1 從上到下 喝一層層的水,豬2 從左向右 喝,豬3 從前向後 喝。所以三頭豬最多能測試125個桶。

總的來說, 用這種方式,我們能測試 (⌊minutestotest / minutestodie⌋ + 1)pigs 個桶。

public

intpoorpigs

(int buckets,

int minutestodie,

int minutestotest)

int length = minutestotest / minutestodie +1;

// 如果buckets大於1的話,pignum至少為1

int pignum =1;

int total = length;

// 可以計算桶的最大個數

while

(total < buckets)

return pignum;

}

458 可憐的小豬

有1000只水桶,其中有且只有一桶裝的含有毒藥,其餘裝的都是水。它們從外 起來都一樣。如果小豬喝了毒藥,它會在15分鐘內死去。問題來了,如果需要你在一小時內,弄清楚哪只水桶含有毒藥,你最少需要多少只豬?回答這個問題,並為下列的高階問題編寫乙個通用演算法。高階 假設有 n 只水桶,豬飲水中毒後會在 m...

458 可憐的小豬

有1000只水桶,其中有且只有一桶裝的含有毒藥,其餘裝的都是水。它們從外 起來都一樣。如果小豬喝了毒藥,它會在15分鐘內死去。問題來了,如果需要你在一小時內,弄清楚哪只水桶含有毒藥,你最少需要多少只豬?回答這個問題,並為下列的高階問題編寫乙個通用演算法。高階 假設有 n 只水桶,豬飲水中毒後會在 m...

458 可憐的小豬

有 buckets 桶液體,其中 正好 有一桶含有毒藥,其餘裝的都是水。它們從外 起來都一樣。為了弄清楚哪只水桶含有毒藥,你可以喂一些豬喝,通過觀察豬是否會死進行判斷。不幸的是,你只有 minutestotest 分鐘時間來確定哪桶液體是有毒的。餵豬的規則如下 選擇若干活豬進行餵養 可以允許小豬同時...