一道算法题

我看到的原创版本是这样的:

这是来自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千米

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值