1. 程式人生 > 其它 >LeetCode——458. 可憐的小豬(Java)

LeetCode——458. 可憐的小豬(Java)

題目描述

題幹:
有 buckets 桶液體,其中 正好 有一桶含有毒藥,其餘裝的都是水。它們從外觀看起來都一樣。
為了弄清楚哪隻水桶含有毒藥,你可以喂一些豬喝,通過觀察豬是否會死進行判斷。
不幸的是,你只有minutesToTest 分鐘時間來確定哪桶液體是有毒的。

餵豬的規則如下:
選擇若干活豬進行餵養
可以允許小豬同時飲用任意數量的桶中的水,並且該過程不需要時間。
小豬喝完水後,必須有 minutesToDie 分鐘的冷卻時間。在這段時間裡,你只能觀察,而不允許繼續餵豬。
過了 minutesToDie 分鐘後,所有喝到毒藥的豬都會死去,其他所有豬都會活下來。
重複這一過程,直到時間用完。
給你桶的數目 buckets ,minutesToDie 和 minutesToTest ,返回在規定時間內判斷哪個桶有毒所需的 最小 豬數。

示例 1:
輸入:buckets = 1000, minutesToDie = 15, minutesToTest = 60
輸出:5

示例 2:
輸入:buckets = 4, minutesToDie = 15, minutesToTest = 15
輸出:2

示例 3:
輸入:buckets = 4, minutesToDie = 15, minutesToTest = 30
輸出:2

題解思路

用最少的豬豬來測試出那一桶水是帶毒的,這裡就必須聯想到經典的老鼠測毒的問題

採用二進位制的方式來標記,最後根據每個老鼠的狀態來確定二進位制的每一個位數來找到那一瓶是毒藥

當時只是記住了這種思想,但是絲毫沒有考慮為什麼採用二進位制,而不用效率更高的高進位制呢

遇到這道題之後才發現,原來具體幾進位制是根據最後結果的狀態來確定的,老鼠的結果之後生和死

而這裡的豬豬卻有分時間的生死,因為他在每一次minutesToDie的時間後都有生死兩種狀態

這裡就有了minutesToTest / minutesToDie + 1種狀態,這裡有用到了一個資訊理論的思想

這確實需要強大的數學功底才能驗證,這裡只運用結論的公式來解答,如果感興趣可以自行去學習

正確程式碼

    public int poorPigs(int buckets, int minutesToDie, int minutesToTest) {
        int times = minutesToTest / minutesToDie + 1;
        double time = Math.log(buckets) / Math.log(times);
        return (int)Math.ceil(time);
    }

總結

資訊理論中引用了“資訊熵”的定義,它和化學中的熵有異曲同工之妙,意思也就是資訊的不確定度

在我理解看來,只有一件事情的可能性大於所有的結果,這件事情才能一定成功,鄙人拙見

如果文章存在問題或者更好的題解,歡迎在評論區斧正和評論,各自努力,最高處見