博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
经典智力题:火车运煤
阅读量:5890 次
发布时间:2019-06-19

本文共 2162 字,大约阅读时间需要 7 分钟。

题目描写叙述例如以下:

        你是一个煤老板。你在矿区开採了3000吨煤,须要运送到市场上去卖,从你的矿区到市场有1000公里。你手里有一列以煤为动力的火车。这个火车一次最多能运1000吨煤,火车每公里消耗一吨煤。

问怎样运送才干运最多的煤到集市?

========== -.- ==========

思考时间

========== -.- ==========

从题中非常easy能看出一个矛盾:路程是1000公里。最多运1000吨煤,显然不能直接走。假设直接走的话,不仅没有煤能送过去,并且还会剩下一大堆煤在原地。

所以肯定是要把原地的煤全都利用起来。所以须要设立中转站。

那么问题就变成了须要几个中转站。各在什么位置?

先从简单入手,首先先在正中间位置,即500公里处设一个中转站,看看有没有什么效果。

为了达到"运最多的煤到终点"的目的,肯定是不应该有煤留在原地的。

所以一開始肯定是要把煤都拿出来,由于一共同拥有3000吨煤,所以第一次搬1000吨出发。到了500公里处剩下500,可是为了可以回去,500吨煤必须所有带回去。

所以第一趟白费力气,浪费了1000吨。

第二个1000吨也是如此。

运第三个1000吨的时候,由于不须要再回去,所以如今得情况是,火车有500吨煤,离终点500公里。所以这种中转站没有不论什么用处。最后能运的煤是0。

可是上述的想法还是能有非常多启示的。从题面能够看出。必须设立中转站。而从上述失败的运送办法中能够看出:设立中转站的目的是,我们得让全部煤不断地靠近终点。

尽管来回跑更费煤,可是煤总量十分过剩,而运载量有限。所以要以"来回跑"的方式让煤不断接近终点。

我们还要明白一点:假如路上一共同拥有N个中转站,我们首先要在起点和第一个中转站来回跑直到运空煤。然后在第一二个中转站之间来回跑,直到把煤运空。跨站运煤并不会更优,跨站是一样的或者更加浪费。

那么一个完美的试探方案就出来了:既然不跨站,那就直接观察当前状态,假设火车与终点之间加上中转站会更优,那就加上去。否则直接走。

那么我们将中转站设在400公里处呢?第一趟来回消耗800吨,中转站留下200吨。第二趟来回消耗800,中转站留下200吨。

第三趟直接过来,到达中转站还剩600吨。如今火车离终点600公里。且火车所属的中转站有1000吨煤。

直接出发,最后成功运送400吨到终点站。

一開始因为距离足够远,显然是要来回跑让全部煤更靠近终点。当距离不太远时就得做出选择了:来回跑以搬运全部煤。还是一次性带上尽可能多的煤直接走。

设距离为X公里。

当前煤有R吨。

当R<=1000,显然是直接走。

当1000<R<=2000时。要走3趟(过去、回来、过去),非常easy能写出公式:(1000-2x) + (R-1000)-x > 1000-x。解得X<(R-1000)/2时来回跑更优。否则带上1000吨直接走。
当2000<R<=3000时,要走5趟。解得当X<(R-1000)/4时来回跑,否则带上1000吨直接走。

当我们每隔250米设一个中转站时,最后能运送的煤是500吨。这是我当时以为的最优结果了。

当时脑袋没有转过来,过了好久才找到比500还要大的方案。

靠直觉来推測中转站的位置和数量,从而慢慢得到最优解显然不是什么好主意。我们知道来回跑太费煤,所以能不来回跑就不来回跑。初始化煤有3000吨。第一回合肯定是5趟来回,设运了X公里。X显然<500(參考上文的第一想法)。所以第一回合结束后剩下的距离>=500米。

所以假设有更优解。第二回合肯定不是直接走。

那么至少还会有第二个中转站了。这个时候的思路很关键,我们须要先推断一回合后的剩余煤量然后才干依次做出最优选择。

①如果一回合后剩余煤<=1000吨。那么第二回合直接走,方程例如以下:

        y = Max[3000-5x-(1000-x)] = 2000-4x

        由于3000-5x<=1000,所以x>=400,所以y<=400

②如果一回合后剩余煤量依然>2000

        假设是这样的情况,说明第一回合走的路相当短。

我们知道,当结果>2000吨时,中间过程分一次还是多次是一样的。

比方第一回合走了100公里,剩余煤2500吨。这和分别走两个50公里或4个25公里是同样的。若剩余2000吨以上火车还是要继续5趟5趟的搬运,所以我们直接把多段合并成一段,一样的。

所以我们不考虑情况②

③如果一回合后剩余煤量在1000吨和2000吨之间

        通过情况2的分析,我们发现事实上仅仅会有①③两种情况。我们还发现。当R处于同一大段的时候,多次和一次的结果是同样的。所以情况③我们也是不断的运煤直到煤量剩余1000吨。然后直接走。

这样看来就是3回合了。

第一回合运了2000吨煤到中转站,消耗1000吨,由于5x=1000,所以第一回合走了200米。

第二回合运了1000吨煤到中转站。消耗1000吨煤,由于3x=1000。所以第二回合走了1000/3米。

第三回合带着1000吨煤直接走。经过前面的运送,还剩下1000-200-1000/3=1400/3公里,所以终于剩余1000-1400/3=1600/3≈533吨。

因为是边思考边写博客,思路可能有点乱 -.-

转载地址:http://zsfsx.baihongyu.com/

你可能感兴趣的文章
lintcode 单词接龙II
查看>>
Material Design学习之 ProgreesBar
查看>>
WEB版一次选择多个文件进行批量上传(WebUploader)的解决方案
查看>>
Redis之 命令行 操作
查看>>
Jvm(46),指令集----对象创建与访问指令
查看>>
EL 表达式小结
查看>>
内部排序
查看>>
jQuery EasyUI API 中文文档 - 组合(Combo)
查看>>
10个关于 Dropbox 的另类功用(知乎问答精编)[还是转来了]
查看>>
Oracle体系结构
查看>>
用Modelsim仿真QII FFT IP核的时候出现的Error: Illegal target for defparam
查看>>
javascript Error对象详解
查看>>
nc 局域网聊天+文件传输(netcat)
查看>>
每天一个linux命令(25):linux文件属性详解
查看>>
go微服务框架go-micro深度学习(三) Registry服务的注册和发现
查看>>
python 重载方法有哪些特点 - 老王python - 博客园
查看>>
在Fedora8上安装MySQL5.0.45的过程
查看>>
TCP长连接与短连接的区别
查看>>
设计模式之命令模式
查看>>
android 测试 mondey
查看>>