运煤问题

你是山西的一个煤老板,你在矿区开采了有3000吨煤需要运送到市场上去卖,从你的矿区到市场有1000公里,你手里有一列烧煤的火车,这个火车最多只能装1000吨煤,且其能耗比较大——每一公里需要耗一吨煤。请问,作为一个懂编程的煤老板的你,你会怎么运送才能运最多的煤到集市?怎样能使到达集市时剩余的煤最多?

思考一下,都可以怎么运?

通过思考,我们可以得到以下几个限制条件或者说结论:

1. 1次是运不完的,所以中间需要停顿,来回搬运

2. 如果需要折返,每次最多只可以跑500米,否则无法回去完成折返

所以搬运方式,不外乎以下几种:

1.先把3000吨煤搬运到某个地方,可能需要来回几趟,然后再把当前剩余的煤再往前搬运一段距离,再来回几趟,最终搬到终点

2.先把x吨煤搬运到某个地方,然后回去后装满,下一次经过那个地方的时候带上那里的煤,往前搬运一段距离,然后再返回起点处,再搬运

举例说明:

1.第一种方案:先装满1000吨煤,行驶100公里,消耗100吨煤,放下800吨煤,折返回去再消耗100吨煤,再从起点处拿1000吨煤,行驶100公里,消耗100吨煤,放下800吨,折返回去消耗100吨,再装满剩余1000吨煤,行驶100公里,此时还剩800+800+900吨煤,问题转化为2500吨煤、900公里的问题了

2.第二种方案:先装满1000吨煤,行驶250公里,消耗250吨煤,放下500吨煤,折返回去消耗250吨,再从起点处拿1000吨,到达250公里处,从上一次放下的煤里取250吨,继续往前走,走到500公里处,放下500吨煤,折返到250公里处,再从这里补充250吨煤,以便折返到起始地点,然后250公里处已经没有煤了,从起点再拿1000吨煤,走到500公里处,补充500吨煤,然后行驶到重点,最终剩余500吨煤

第二种方案看似很有技巧,利用了上一次的运的煤,但是真的需要这种技巧性吗?

分析一下,第二种方案完全可以转化为第一种方案,先全部运到250公里处,然后再从250公里处搬运到500公里处,最终的消耗是相等的。第一种并不会剩余更多。其实质在于中间的补充无非是加满再继续往前走,完全可以分成两段路。

这样的话,我们只用深究第一种方案。

可以发现,我们把搬运分成几段以后,每段需要折返奇数次,并且随着剩余煤的数量减少,折返的次数将会越来越少。

连续几段相同折返次数的搬运过程可以合并成一次同等折返次数的搬运,故我们就可以把整个过程分成3段,第一段折返5次,第二段折返3次,第三段折返1次。

当剩余煤的数量在3000~2000吨之间,最少需要折返5次,当剩余煤的数量在2000~1000之间,至少需要折返3次,小于1000时,需要折返1次。

故在消耗1000吨时我们尽量走的远,故折返5次,最远能走1000/5=200公里,折返3次能走1000/3=333.3公里,剩余1000-200-333.3=466.6公里,需消耗466.6吨煤,最终剩余533.3吨煤。


你可能感兴趣的:(算法,数学)