火车运煤问题

Posted by rk700 on November 22, 2014

今天比赛有一道逻辑题,是这么说的(大意):

小明要穿越荒野,距离目的地有600公里。他身上最多可以携带300单位的补给,而且每走1公里会消耗1单位的补给。假设他可以在中途任意设置补给点存放补给。那么要走600公里,出发点至少要有多少单位的补给?如果出发点有3300单位的补给,他最远能走多远?

这类题目以前在网上看到过,不过当时是火车运煤。再次回顾整理了下,找到了思路。

首先,小明肯定要多次折返,不断地把物资向前搬运。由直觉可知,每次折返,出发前尽量多装,返回时最好不要有剩余,这样向前搬运的最多最远。由于最多可以带300单位,所以每次折返,出发点的补给会少300。

于是我们先考虑第二问,因为这一问相对来说更直观。由于3300是300的整数倍,所以按每次折返消耗掉(包括放置在补给点的)300单位计算,需11次折返;而其实最后一次是不需要回到出发点的,因为这次已经把全部物资都搬走了,所以共11*2-1=21个单程。

那么这第一个补给点应该设在哪里呢?另一个直觉是,如果将这个补给点视为新的出发点,那么这个出发点的物资会比最开始的少,而且我们希望往下一个补给点搬运时折返次数少一些。具体地,我们希望第1个补给点的物资量是300的整数倍,因为这样不会有浪费,即最后一个折返的单程没有装满。所以这里我们让第一个补给点还留有3000单位的补给,即从出发到这个补给点消耗300单位,那么路程就是300/21。

以此类推,下个补给点的物资量是2700,折返还是消耗300,即第一个和第二个补给点相距300/19。这里19是因为运第一个补给点的3000需要(3000/300)*2-1=19个单程。

到最后一个补给点,剩300单位,到这里我们把这300全部拿上,一直走到底。

所以,这3300单位的补给,最远可以走300(1+1/3+1/5+…+1/21)

知道了第二问的方法,第一问就清晰多了。不同之处是我们需要反过来算初始单位量。通过简单计算发现,2100单位的补给还不足以走600公里,而2400单位的补给就可以走超过600公里了。于是所需单位量应该在2100和2400之间。

假设初始单位量是2100+x,x<300。那么从出发点搬运到第一个补给点我们仍然需要15个单程,而且最后一次只搬了x单位,没有装满,有些浪费。因此,到第一个补给点后,我们不希望再有这样的浪费,即到这个补给点的物资量应留为300的整数倍。具体地,第一个补给点剩下2100单位,即出发点到这个补给点消耗了x单位,距离是x/15。在此之后,就和第一问的思路一样了。

所以,2100+x最远可以走x/15+300(1+1/3+…+1/13)。令其等于600,可以得到x的值。

综上,这类题目的一般性结论为:

假设出发点有M单位,每次最大携带N单位。令k是小于M/N的最大整数,则最远到达距离为N*(1+1/3+1/5+…+1/(2k-1))+(M-Nk)/(2k+1)