將三類分石子的問題整理到一起
問題一: 有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的整數倍的後拿的肯定贏,否則先拿,拿餘數就可以了