分石子的問題(n個石子放入m個筐子,兩堆石子游戲,一堆石子游戲)

將三類分石子的問題整理到一起

問題一: 有n個石頭,k個框子。把n個石頭按順序放入k個框子,比如1~3放入1,4~6放入2,要求最大重量的框子的重量最小的放法。

設石子的重量分別爲Q1,Q2,...

g(i,j)=Qi+,...,+Qj;

f(i,j)表示把i個石子放到j個框的最大重量框的重量。

則f(i,j)=minj-1<=p<i (f(i,j),max(f(p,j-1),g(p+1,i)));

g(i,i)=Qi ,f(1,1)=g(1,1),f(i,1)=g(1,i);

1<=i<=n;

1<=j<=k;

如果提前把Si =Q1+,..,+Qi 計算出來,g(j,k)=Sk -Sj-1 則時間複雜度爲O(N2 )

 

         對於這個問題,提出一種nlog(n)的算法,用二分探測的方法石頭的重量範圍在1~N的範圍內。初始值可以設置爲所有石塊重量之和的平均值,然後檢查該值是否合理,如果合理,則減小該值,否則增大,按照二分法處理。總會找到一個值,恰好可以,小於他的都不行。


方法二要明顯優於方法一

 

問題二:遊戲:有兩堆石子,兩個人來取石子。取石子的方式爲:可以從一堆中取任意多個石子,或者,從兩堆中取一樣多的石子

               想想一下取石子的方法。

               如果一堆爲兩個石子,一堆爲1個石子,那麼先取的人肯定是要輸的

               如果兩堆石子數量相等,或者一堆數量爲0,則先取的一定會贏。

 

              若當前一堆的數量爲n,另一堆的數量爲n+1,則先取的一定會輸。例如先取的人在某一堆中取剩k個,k不等於0,否則,另一人立刻z在另一堆中取剩k,或者k-1個,始終保持一堆爲m,一堆爲m+1的狀態,m不爲0,則後取的一定會贏

 

問題三:非取石子問題,在面試中遇到的一個問題。其實是很簡單的題目,以前沒有遇到過

                遊戲:假如有N個石子,每次最多可以取k個,兩個人取石子,問先取的贏,還是後取的贏

 

               這個問題比較簡單,以前從來沒有思考過。直接給答案:步長+1的整數倍的後拿的肯定贏,否則先拿,拿餘數就可以了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章