阿里面试题:摩托车最多跑多远

1,773 阅读3分钟

最近看到一个阿里的面试题,题目:

有16辆摩托车,每辆摩托车的油可以跑100KM,那么要送一个东西,最远可以送到多少KM以外?

说实话,第一眼看到这个题目的反应,就是不知道什么意思,难道是要摩托车拖着摩托车去跑吗??那样油耗是不是又无法计算了??很显然题目的设计完全不在于这。其实忽略了最重要的东西,那就是油,摩托车运动需要消耗油,要想使摩托车跑到最远的距离,那么跑到最远的那辆摩托车一定是消耗油最多的!而满油跑 100KM 明显不是正确答案(否则需要那么多摩托车做什么。。),所以关键点在于油的交换

于是我想到了第一种解法:

16辆车同时起步,跑50KM后,每辆车还剩 50% 的油,将其中 8辆的油加入到另外8辆中,使其满油!那么还剩8辆车继续跑,50KM后,将其中4辆的油放到另外4辆中,使其满油。继续跑50KM,将其中2辆车的油加到另外两辆中去,使其满油。继续跑50KM,将其中一辆的油加到另一辆中去,满油!最后一辆车满油跑完100KM,结束。

图解: ScreenRecorderProject6_1.gif

那么按照上面的方法计算最终跑的距离是: 50 + 50 + 50 + 50 + 100 = 300KM

仔细想一想,这个题目真的这么简单吗? 300KM 真的就是最有解答么。实际不是!看似很合理的做法,实际上存在漏洞。

问题的核心:想要达到最远距离,那么同时在跑的摩托车数量要达到最少!也就是说浪费的油是最少的!

可以将16辆车分解一下,先看最低的情况,2辆车:

两辆车同时起跑线,50KM后将一辆车的油全部加给另一辆车,然后另一辆车跑完100KM

似乎不存在另一种解法

接下啦 3辆车:

当我们要找中转站的时候,就应该要了解到,要使中转站的距离最近(丢弃的车跑的距离最短)当是最优解!

也就是说3辆车 同时起跑,当跑到 3/100 时,每辆车还剩 2/3 的油,再将一辆车的油分别刚好加满另外两辆车,这样就达到了跑最近的距离丢弃的原则!

4辆车: 跑 1/4时开始换油

以此类推 16 辆车: 跑 1/16 时开始换油,剩下的 15/16 刚好加给另外15辆车

那么得出结论,可以尝试倒推:

16 辆车:

跑 1/16 时开始换油,剩下的 15/16 刚好加给另外15辆车, 还剩 15辆车

15 辆车:

跑 1/15 时开始换油,剩下的 14/15 刚好加给另外14辆车, 还剩 14辆车 。

2辆车: 跑 1/2 时开始换油,剩下的 1/2 刚好加给另外1辆车, 还剩 1辆车

1辆车:

跑100KM

所以最终的结果可以推算出:

(1/16 + 1/15 + 1/14 + 1/13 + 1/12 + 1/11 + 1/10 + 1/9 + 1/8 + 1/7 + 1/6 + 1/5 + 1/4 + 1/3 + 1/2 + 1/1) * 100 = 338.0729KM

这样看来是比一开始计算的 300KM 实际上是跑的远的,理论和计算得出的结果一致。

抓住底层逻辑:车是累赘,一有机会,立马舍弃!

如此一来题目就很好解决了