題意:給你一些數(shù)量的桶buckets,已知某一個桶里有毒藥,豬在喝了毒藥后一定時間內(nèi)minutesToDie會死亡稿存,給一個規(guī)定時間minutesToTest,問最少需要多少豬才能唯一確定毒藥在哪個桶里瞳秽。
解題思路:開始的時候總想著二分查找瓣履,二分的思路還不是最快的,最快的是根據(jù)位就像二進制位來確定桶的位置练俐。
如果死亡時間15min拂苹,規(guī)定在60min內(nèi)確定毒藥,共25個桶痰洒。因為15分鐘揭露一次瓢棒,所以60/15=4次,可以揭露4次丘喻,但可以做5次驗證脯宿,因為如果前4次豬都沒死,那肯定就是第五次會死泉粉,所以可以采用5進制對桶進行編碼连霉。
把桶編號為
00 01 02 03 04
10 11 12 13 14
30 31 32 33 34
40 41 42 43 44
50 51 52 53 54
在0分鐘時第一只豬喝開頭編碼全為0的桶,第二只豬喝第二位編碼全為0的桶嗡靡;
15分鐘后第一只豬喝第一位編碼全為1的桶跺撼,第二只豬喝第二位編碼全為1的桶;
............
每只豬守護一位編碼讨彼,反正在規(guī)定時間內(nèi)歉井,一定可以得到自己守護的那位編碼到底哪一個是有毒的,最后經(jīng)過所有豬的合并哈误,可以唯一標示一個桶有毒哩至。
對題意來說,1000個桶蜜自,15分鐘死亡時間菩貌,60分鐘驗證時間。
可以驗證60/15 = 4次重荠,所以可以采用5進制編碼桶箭阶。
每增加一位,就增加一頭豬;一位可以驗證5桶仇参,二位可以驗證55=25桶媳危,三位可以驗證555=125桶,四位驗證5555=600桶冈敛,五位可以驗證3000桶。所以至少需要5頭豬鸣皂。
對桶的編碼就是00000,00001,00002,00003,00004,00010,00011,00012....34234......
開始抓谴,第一頭豬把第一位為0的全喝,第二頭豬把第二位為0的全喝寞缝。癌压。。
15分鐘后第一頭豬死了可以確定帶毒的桶第一位編碼為0荆陆,繼續(xù)第二頭豬把第二位為1的全喝滩届。。被啼。
60分鐘后帜消,根據(jù)豬死的情況,可以唯一對應一個編碼即為有毒的桶的編碼浓体。
解題目:確定位數(shù)bits = minutesToTest/minutesToDie + 1;
確定豬的個數(shù)就是bits**豬個數(shù) >=buckets.
class Solution {
public:
int poorPigs(int buckets, int minutesToDie, int minutesToTest) {
if(buckets == 1)
return 0;
int bits = minutesToTest / minutesToDie + 1;
int cnt = 1, nums = bits;
while(nums < buckets){
cnt++;
nums *= bits;
}
return cnt;
}
};