我看到的原创版本是这样的:
这是来自Adobe公司一道题目:一辆加满油的摩托车可以骑50千米,如果你有50辆这样的摩托车,你能骑多远?
很自然的思路是50辆摩托车一起开,在中途某个时间点淘汰到n辆,这n辆车剩余的油加到还剩下的50-n辆车中,剩余的车继续开。依次进行。
有一点也很明白易懂,就是这n辆车剩余的油刚好可以加满其余的车。
所以,问题关键是在什么时候开始淘汰车加油?
大概是2分法深深毒害了众生的思维吧。我看到的原创版本算法是这样的:50辆车一起开,待到某个时刻,淘汰25辆,可以证明这个时候车走了25千米,依次类推。
用计算机模拟了一下,这种2分法大概可以前进191千米。
其实最好的方法应该是每次淘汰一辆车,证明如下:
假设现在是m辆车,如果要淘汰到只剩下n辆车(m>n)。可以比较两种方法,一种是一辆一辆淘汰,另一种是一次性淘汰m-n辆。在此期间,第一种方法行驶的路程为:50*(1/m + 1/(m-1) + ... +1/(n+1))。第二种方法行驶的路程为:50 * (m-n)/m,显然当m-n > 1时,(1/m + 1/(m-1) + ... +1/(n+1)) > (m-n)/m。(左式一共m-n项,每一项都>= 1/m)。
因为m和n是任意的,所以一辆一辆淘汰时最佳算法。
通过计算机计算了一下这种方法,大概可以前进225千米。