且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

算法-火车运煤

更新时间:2022-09-09 11:23:28

周末闲来无事,看到一个很有意思的题目,题目是这样的,假设你是山西的一个煤老板,你在矿区开采了有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吨~

个人周末一点个人分析的文章,如果有什么不当的地方,忘大家多包涵~

本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/4131019.html,如需转载请自行联系原作者