周末闲来无事,看到一个很有意思的题目,题目是这样的,假设你是山西的一个煤老板,你在矿区开采了有3000吨煤需要运送到市场上去卖,从你的矿区到市场有1000公里,你手里有一列烧煤的火车,这个火车最多只能装1000吨煤,且其能耗比较大-每一公里需要耗一吨煤。请问,作为一个懂编程的煤老板的你,你会怎么运送才能运最多的煤到集市?话说煤老板这年头过的也不是很容易,不过相比程序员来说,还是煤老板享受的机会比我等程序员要好很多~题目看起来很无解,网上也很多人给出了答案和自己的分析过程,能力有限,没有想到最优解,看到有的人给了最优的方式,大致的分享一下自己的思考过程吧。
常见思考方式
本人只想到最常见的思考方式,题目看起来是无解,就是火车一次性运煤到市区基本是空车到市区,没有任何返回,这个时候我想的是能不能中途停留一下,比如说拉到500公里处,拉到之后再回去的拉剩下的煤基本上也是空车,接下来思考的方式就不走那么远,第一次走250公里,可以卸载500吨煤,第二次拉1000吨煤,从250公里处拉到500公里处,卸载500吨煤,第三次拉1000吨煤,然后在500公里处将煤都装上,到达终点处还有500吨煤;这就是我这个懒人能想到的最佳思考方式了,一般来说大家想想都应该没什么问题~那么问题来了,这个究竟不是最佳的思考的方式了,所以最优的结果还是需要验证一下的~
数学思考方式
网上有的人写的很速度,简单点就是中间有两个补给点,第一个补给点1000/5=200,第二个补给点1000/3=333,最后在200+333公路处有1000吨煤,最后剩余的是533吨煤。
上面说的很简单,看完之后我的第一感觉,为毛大家数学都这么好,为什么上来就知道是五次,第二个补给点是三次,不过思考了一阵子之后感觉差不多明白看了意思,假设起点是A,终点是 B:
首先有个隐形条件就是火车煤走一公里需要消耗一吨煤,为了保证最大的到货量,每次肯定是满车走,装满1000吨,现在又3000吨煤,所以最优的办法肯定是只需要拉三次,火车最大的载重是1000吨,相当于在最后一个地点离终点的距离越近,那么最终剩下的煤越多,起始点A有3000吨,最后一站C需要1000吨,那么由此需要一个中间点B点:
------------------------3------------------------->
---------------2--------------->
----1--->
A--------->B--------------->C---------------->D
<------1----
<--------------------2-----------
通过上图可以很容易理解一个问题就是其实就从起始点A到B一次,从A到C一次,从A到D一次,每次1000吨,最终到达终点站:
AB+BC+CD=1000
5AB≥1000
3BC≥1000
CD=1000-AB-BC,CD越短剩下的煤越多,那么很显然AB,BC去临界值,AB=200,BC≈333,最后在D处还有533吨煤;
如果不需要B点,5次直接运到C也可行,5AC≥2000,AC为400,最后的最多剩余的煤为400吨~
个人周末一点个人分析的文章,如果有什么不当的地方,忘大家多包涵~