猜數字遊戲

2022-08-20 17:39:08 字數 1697 閱讀 7727

答案:猜測序列是14,、27、39、50、60、69、77、84、90、95、99

因為無論第幾次猜大了,最終的總次數總是14。     這個題目類似於一道google面試題 :  扔玻璃球求最高樓層。。

一道關於動態規劃的面試題——google面試題:扔玻璃珠

某幢大樓有100層。你手裡有兩顆一模一樣的玻璃珠。當你拿著玻璃珠在某一層往下扔的時候,一定會有兩個結果,玻璃珠碎了或者沒碎。這幢大樓有個臨界樓層。低於它的樓層,往下扔玻璃珠,玻璃珠不會碎,等於或高於它的樓層,扔下玻璃珠,玻璃珠一定會碎。玻璃珠碎了就不能再扔。現在讓你設計一種方式,使得在該方式下,最壞的情況扔的次數比其他任何方式最壞的次數都少。也就是設計一種最有效的方式。

當然,為了這一顆玻璃珠代價也高了點,還是採取另外一種辦法吧。隨便挑一層,假如為n層,扔下去後,如果碎了,那就只能從第一層開始試了,最壞的情況可能為n。假如沒碎,就一次增加一層繼續扔吧,這時最壞的情況為100-n。也就是說,採用這種辦法,最壞的情況為max。之所以要加一,是因為第一次是從第n層開始扔。

不過還是覺得不夠好,運氣好的話,挑到的n可能剛好是臨界樓層,運氣不好的話,要扔的次數還是很多。不過回過頭看看第二種方式,有沒有什麼發現。假如沒摔的話,不如不要一次增加一層繼續扔吧,而是採取另外一種方式:把問題轉換為100-n,在這裡面找臨界樓層,這樣不就把問題轉換成用遞迴的方式來解決嗎?看下面:

假如結果都儲存在f[101]這個陣列裡面,那麼:

f[n]=100-n,

f[100]=min(max(1,1+f[n-1]),max(2,1+f[n-2]),……,max(n-1,1+f[1]));

看出來了沒有,其實最終就是利用動態規劃來解決這個問題。

折騰n久才把題目的思路想通。

網上題目給的解釋的東西總是不怎麼符合自己的口味了(有時候還誤人子弟啊),老讓人想好半天,這時老感覺自己xq不夠用啊,要是可開掛就好了!哎~什麼時候開看到些更基礎些的呢~畢竟動態規劃的東西太靈活了。需要好好想想才可以得出結果啊。

狀態:f(n)相當於判斷n層樓需要玻璃珠個最少的個數。如果在這n層中的第i層扔乙個玻璃球,最多的此次就位max,(注意加一,加上本次扔的玻珠,我就忘了這個。)然後在這n層中每一層試試看。找出最小次數作為f(n)=。終止的條件:f(0)=0,f(1)=1。根據動態規劃的思想,使用乙個陣列儲存每個子問題的解,需要時直接取出。

然後又是紙寫**。華麗的遞迴出來後,除錯,錯錯錯。。。

咋一下,遞迴太深,改非遞迴。幾個細節錯誤。。

1#define max(a,b) ((a)>(b)?(a):(b))23

int func12(int n) //

411 f = (int *)malloc((sizeof(int)*(n+1

)));

12 memset(f, 0, sizeof(int)*(n+1)); //

初始化13 f[0]=0

;14 f[1]= 1;15

16for (int i=2; i<=n; i++)

1726

}27 f[i] =min;28}

29int k =f[n];

3031

free(f);

3233

return

k;34}35

36//

呼叫37

38 cout<100)《遞迴和回溯等思想還沒有真正學會其精髓啊~

不說了,說多了都是淚。。。。

畢。

猜數字遊戲

問題描述 猜數字遊戲 隨機出乙個兩位數,然後讓你猜,直到猜對為止。猜對後可以提示選擇是否再玩一次。include include using namespace std int main srand unsigned int time null int num rand 90 10 隨機出乙個兩位數...

猜數字遊戲

author 徐權 data 2015728 function 猜數字遊戲 實用平台 vs2012及以上 如果要移植到其他平台scanf s和puts s 應改為scanf和puts即可 include include include include define n 5 定義陣列大小,從而決定猜的...

猜數字遊戲

初次見到題目,覺得很簡單,可是仔細敲 時候卻發現根本無法處理如下情況 正確序列 1,2,3,4 猜測序列 1,1,1,1 我選擇用字串儲存正確的,然後如果對應上就把它變成字母,下一次就不會算他了,可是如果這樣子 正確 1,2,3,4 錯誤 2,3,3,4 錯誤的3算了,正確卻沒有算,這樣顯然不符合題...