将三类分石子的问题整理到一起
问题一: 有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的整数倍的后拿的肯定赢,否则先拿,拿余数就可以了