分石子的问题(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的整数倍的后拿的肯定赢,否则先拿,拿余数就可以了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章