1. 程式人生 > >【LeetCode 簡單題】105-可憐的小豬

【LeetCode 簡單題】105-可憐的小豬

宣告:

今天是第105道題。有1000只水桶,其中有且只有一桶裝的含有毒藥,其餘裝的都是水。它們從外觀看起來都一樣。如果小豬喝了毒藥,它會在15分鐘內死去。問題來了,如果需要你在一小時內,弄清楚哪隻水桶含有毒藥,你最少需要多少隻豬?以下所有程式碼經過樓主驗證都能在LeetCode上執行成功,程式碼也是借鑑別人的,在文末會附上參考的部落格連結,如果侵犯了博主的相關權益,請聯絡我刪除

(手動比心ღ( ´・ᴗ・` ))

正文

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

進階:

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

解法1。1只小豬最多可以測試p/m次,可以檢測p/m+1桶水(+1是因為給定的水裡必有毒,雖然只能測p/m次,但剩下1桶不證自明);2只小豬可以分為x-y二維座標系,1只負責x軸,1只負責y軸,從左下角開始試,最多可以試(p/m+1)^2桶水,那麼同理,推廣到n只豬,就是n維座標系,總結一下規律如下。那麼反過來已知桶數求最少的豬就很好求了,程式碼如下。

  • 1只豬:p/m+1桶水
  • 2只豬:(p/m+1)^2桶水
  • 3只豬:(p/m+1)^3桶水
  • ……
  • n只豬:(p/m+1)^n桶水

執行用時: 24 ms, 在Poor Pigs的Python提交中擊敗了89.80% 的使用者

class Solution(object):
    def poorPigs(self, buckets, minutesToDie, minutesToTest):
        """
        :type buckets: int
        :type minutesToDie: int
        :type minutesToTest: int
        :rtype: int
        """
        fold = minutesToTest / minutesToDie + 1
        i = 0    # 注意這裡i從0開始
        while buckets > pow(fold,i):
            i += 1
        return i

        # 其實上面這段程式碼可以簡化成一句:
        import math
        return int(math.ceil(math.log(buckets,fold)))

 

結尾

解法1:https://blog.csdn.net/gleam_/article/details/80251769

解法竟是如此地一致,LeetCode上提交的思路都是這樣的,就是程式碼風格不同~