1. 程式人生 > >騰訊筆試題:猜字遊戲---猜1-100之間一個數字,最少多少次?第一次猜的數是幾?

騰訊筆試題:猜字遊戲---猜1-100之間一個數字,最少多少次?第一次猜的數是幾?

題目: A、B兩人玩猜字遊戲,遊戲規則如下: A選定一個 [1,100]之間的數字背對B寫在紙上,然後讓B開始猜; 如果B猜的偏小,A會提示B這次猜的偏小; 一旦B某次猜的偏大,A就不再提示,此次之後B猜的偏小A也不會再提示,只回答猜對與否。 請問:B至少要猜()次才能保證猜對?在這種策略下,B第一次猜測的數字是()。 解析: 假設至少要猜x次。 第一次猜的數是y(y>=1並且y<=x)。(如果y>x,如果沒有提示,那麼無法用x次保證猜對。) 如果沒有提示,說明猜的偏大,則從y往下一個一個猜(至多y-1次); 如果提示偏小,第二次猜的數為y+(x-1), 如果沒有提示,說明猜的偏大,則從y+(x-1)往下一個一個猜(至多x-1次),如果提示偏小,第三次猜的數為y+(x-1)+(x-2), 如果沒有提示,說明猜的偏大,則從y+(x+1)+(x-2)往下一個一個猜(至多x-2次),如果提示偏小,第四次猜的數為y+(x-1)+(x-2)+(x-3), 如果沒有提示,說明猜的偏大,則從y+(x-1)+(x-2)+(x-3)往下一個一個猜(至多x-3次),如果提示偏小,則第五次猜的數為y+(x-1)+(x-2)+(x-3)+(x-4), 依次類推.... 最後得到:  y+(x-1)+(x-2)+(x-3)+...+1>=100  (1) 1=<y<=x(2) 對方程(1)的解釋: 因為猜的次數為x次,第x次猜的數為y+(x-1)+(x-2)+(x-3)+...+1,如果這個數小於100,此時出現兩種情況:1)沒有提示,說明猜的數偏大,此時不需要滿足這個方程。2)提示偏小,說明猜的數偏小,但是這時已經猜了x次,用完了所有的機會,無法繼續猜比y+(x-1)+(x-2)+(x-3)+...+1更大的數了。因為數的範圍是[1,100],只要y+(x-1)+(x-2)+(x-3)+...+1>=100就不會出現第二種情況了。 題目要求至少要猜多少次才能保證猜對。根據方程1,為保證x最小,y應該取得最大值,即y=x,此時y+(x-1)+(x-2)+(x-3)+...+1=x+(x-1)+(x-2)+(x-3)+....+1=x(x+1)/2>=100 解方程得到x>=13.650971698...,即至少要猜14次,才能保證猜對。 問題的第二問:在這種策略下,B第一次猜的數字是多少? 上面提到,要保證x最小,y應該取最大值,即y=x。實際解方程x(x+1)/2>=100得到x>=13.650971698...,由於x必須為整數,所以x取14。由於x取14,比實際的值要大,所以y不一定要等於14。將x=14帶入方程y+(x-1)+(x-2)+(x-3)+...+1>=100得到y>=9,所以y的取值範圍是9到14之間的任意數。也就是說第一次猜的數可以是9到14之間的任意數。 猜數序列:(一直提示偏小的猜數序列) 9、22、34、45、55、64、72、79、85、90、94、97、99、100 10、23、35、46、56、65、73、80、86、91、95、98、100 11、24、36、47、57、66、74、81、87、92、96、99、100 12、25、37、48、58、67、75、82、88、93、97、100 13、26、38、49、59、68、76、83、89、94、98、100 14、27、39、50、60、69、77、84、90、95、99、100 ---------------------------------------------------------------------------------------------------------------------------------------- A、B兩人玩猜字遊戲,遊戲規則如下: A選定一個 [1,100]之間的數字背對B寫在紙上,然後讓B開始猜; 如果B猜的偏小,A會提示B這次猜的偏小; 一旦B某次猜的偏大,A就不再提示,此次之後B猜的偏小A也不會再提示,只回答猜對與否。 請問:B至少要猜( )次才能保證猜對?在這種策略下,B第一次猜測的數字是( )。 首先閱讀題目,一個很重要的資訊點就是: 一旦B某次猜的偏大,A就不再提示,此次之後B猜的偏小A也不會再提示,只回答猜對與否 。如果沒有這個條件,或者說改變這個條件,改為: 如果B猜的偏大,A會提示B這次猜的偏大 那麼相信大家都會給出答案,那就是用二分法,只需要7次就可以保證猜對了。 但是現在的條件變了,如果B猜的偏大,那麼不提示,所以我們得出結論就是:如果猜的偏大,只能一個一個往下猜。答案在下面雞這個題目裡面。 標準答案是14次,第一個數選擇 9-14中任意一個猜,假設第一個數猜10,依次為23,35,46…

先說答案:猜測序列為14, 27, 39, 50, 60,69, 77, 84, 90, 95, 99,哪一次偏大了,就在該數與上一個數的區間一個個猜,最多13次一定能猜到。 

如何得到上面這個答案呢?其實這道題跟google那道100層樓丟玻璃球問題是一模一樣的,只不過換了一種說法而已。下面講講解題思路。 

剛一看到這道題,熟悉二分查詢的同學肯定馬上想到要用二分查詢來猜,第一個猜50,第二個猜25或者75……可是這樣有一個問題,傳統的二分查詢是需要每次都知道是偏大還是偏小的,但這裡一旦偏大,就再也得不到這個資訊了。這就導致了在這裡如果繼續使用這種類似二分查詢的方法最壞情況下猜測次數分佈不均勻。比如,如果猜50,偏大了,那隻能把50以內的挨個猜一遍,需要50次;但如果偏小了,那再猜75,若偏大,此時只需要在(50,75)之間挨個猜一遍,共1+1+24=26次;顯然,偏大的情況越晚出現,需要的總次數越少。這就是最壞情況總猜測次數分佈不均勻的體現。 

直覺告訴我們,要使得總猜測次數最少,那就讓最壞情況的猜測次數分佈均勻即可。假設最多猜測k次,那麼第一個猜的數字應該是k+1,因為若偏大了,則逐一把k, k-1, ……2的共k-1個數猜一遍,最壞的情況是都沒猜中,則1必定是正確結果;若偏小了,則繼續按照下面講的方式猜。

若偏小了,則第二個猜的數字x應該是什麼呢?這就要使得若第二次猜偏大了的話,必定能把總共的猜測次數也控制在k次,因此第二個猜的數x跟第一個猜的數k-1之間要間隔k-1個數,因為這樣的話,即使第二個數偏大了,則逐一把x-1,x-2,……k+2的共k-2個數猜一遍,必定能得到答案。因此第二個猜的數字x為2k。

依此類推,要把100覆蓋,則可以列出不等式:(k+1) + k + (K-1) + …… + 2 + 1 >= 100,解得k >= 13(取整之後)。 


下面還有一道類同的雞蛋題:
  1. 假設你有2個雞蛋,你現在想知道這些雞蛋的硬度。
  2. 你家住在120層高的大樓裡,現在要在這座大樓上測試雞蛋的硬度。
  3. 每個雞蛋的硬度相同,雞蛋的硬度定義為:如果雞蛋從第m層上掉
  4. 下來沒有破裂,而從第m+1層上掉下來就破裂了,那麼這個雞蛋的
  5. 硬度就是m。某個雞蛋如果在實驗中破裂了就永遠的損失了。要求
  6. 提供一種方案,在最壞情況下做最少需要最少次數的實驗即可把雞
  7. 蛋的硬度檢驗出來?