经典智力题:火车运煤

题目描述如下:

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

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

思考时间

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

从题中很容易能看出一个矛盾:路程是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趟(过去、回来、过去),很容易能写出公式:(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吨。

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

经典智力题:火车运煤

时间: 2024-10-29 03:39:58

经典智力题:火车运煤的相关文章

类Runtime和火车运煤问题

1 类Runtime 每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接.可以通过 getRuntime 方法获取当前运行时. 应用程序不能创建自己的 Runtime 类实例. 2 火车运煤问题 问题来源:http://coolshell.cn/articles/4429.html/comment-page-5#comments 你是山西的一个煤老板,你在矿区开采了有3000吨煤需要运送到市场上去卖,从你的矿区到市场有1000公里,你手里有一列烧煤的火车

经典智力题:飞机加油问题

难度系数:★★ 题目:每个飞机只有一个油箱,飞机之间可以相互加油(注意是相互,没有加油机)一箱油可供一架飞机绕地球飞半圈.为使至少一架飞机绕地球一圈回到起飞时的飞机场,至少需要出动几架飞机?(所有飞机从同一机场起飞,而且必须安全返回机场,不允许中途降落,中间没有飞机场) 分析:至少需要出动5 架飞机.思路是这样的,一架飞机要想完成绕地球一周的飞行,至少需要别的飞机给它提供1 箱油.最划算的办法显然是,派飞机和它结伴飞行前四分之一周以及后四分之一周,(因为这两段路程距离基地近所花代价小.)由它独立

火车运煤问题

题目: 煤矿有 3000 吨煤要拿到市场上卖,有一辆火车可以用来运煤,火车最多能装 1000 吨煤,且火车本身需要烧煤做动力,每走 1 公里消耗 1 吨煤,如何运煤才能使得运到市场的煤最多,最多是多少? 分析: 设出发点为 A ,终点为 B,火车一定不能一下子就从 A 跑到 B,这样就 B 时刚好什么也没剩下.到中点也不行,因为到中点后再回到 A,刚好把自己带的煤全部用完,只烧煤不干活!那到底要走多远返回合适呢? 我们可以倒着推理,最后一次火车到 B 点的最好情况是火车从 A B 之间的某点带

生活小趣味-火车运煤

周末闲来无事,看到一个很有意思的题目,题目是这样的,假设你是山西的一个煤老板,你在矿区开采了有3000吨煤需要运送到市场上去卖,从你的矿区到市场有1000公里,你手里有一列烧煤的火车,这个火车最多只能装1000吨煤,且其能耗比较大-每一公里需要耗一吨煤.请问,作为一个懂编程的煤老板的你,你会怎么运送才能运最多的煤到集市?话说煤老板这年头过的也不是很容易,不过相比程序员来说,还是煤老板享受的机会比我等程序员要好很多~题目看起来很无解,网上也很多人给出了答案和自己的分析过程,能力有限,没有想到最优解

智力题:1-28题

1.你让工人为你工作7天,给工人的回报是一根金条.金条平分成相连的7段 ,你必须在每天结束时给他们一段金条,如果只许你两次把金条弄断,你如何给你 的工人付费? 答案:分成1/7,2/7,4/7,因为1,2,4可以组合成1-7的任何一个数字. 2.请把一盒蛋糕切成8份,分给8个人,但蛋糕盒里还必须留有一份. 答案:面对这样的怪题,把切成的8份蛋糕先拿出7份分给7人,剩下的 1份连蛋糕盒一起分给第8个人. 3.小明一家过一座桥,过桥时是黑夜,所以必须有灯.现在小明过桥要1秒, 小明的弟弟要3秒,小明

java面试智力题

智力题,每个正式的笔试.面试都会出,而且在面大企业的时候必然会问到,笔者曾在很多面试中,都被问到过,不过答得都不是很好,因为时间很短,加上我们有时候过于紧张,所以做出这类问题,还是有一定的难度,从这篇文章中我会总结一些常见的智力题,希望各位读者能在本章所列的题中找出做这类题的方法,克服面试中的难题! 1.农民分金条问题 题目:你让农民为你工作7天,给他的回报是一根金条.金条平分成相连的7段,你必须在每天结束时给他们一段金条,如果只许你两次把金条弄断,你如何 给你的工人付费,保证该农民在七天中任意

Javascript基础练习之实现C语言经典程序题

前言: 最近在学习Javascript语言,看到网上很多都是在介绍Javascript如何解决网页上问题的代码,所以想另辟蹊径,用Javascript代码来实现C语言经典程序题.当然,这些C语言程序题也是比较简单,主要想通过Javascript语言实现,起到语法练习作用,也想来对比一下C语言和Javascript语言实现的相同点和不同点,从而巩固记忆,加强学习效果!!! 一.C语言经典程序题1 1. 题目描述: 马克思的手稿中有这样一道有趣的数学题:有30个人,其中有男人,女人,小孩.他们在一家

经典搜索题

今天搞了一下传说中的经典搜索题——poj1011,果然里面充斥着各种巧妙的剪枝,做完之后回味一下还是感觉构思太巧妙,所以总结记录一下加深理解. 原题:http://poj.org/problem?id=1011 刚开始接触搜索的初学者面对这道题可能感觉无从下手,即便是告诉了要用深搜解决这道题,也不知道怎么用,我现在也对搜索有了更多的理解与体会,其实不要把搜索只理解为在一个地图上找点,其实搜索更可以抽象为当面对多个选择的时候如何抉择,深搜就是先认准一个方向走下去,不行再回来,走别的路:广搜就是把每

智力题小结(2)

1.你在一幢100层大楼下,有21根电线线头标有数字1..21.这些电线一直延伸到大楼顶,楼顶的线头处标有字母A..U.你不知道下面的数字和上面的字母的对应关系.你有一个电池,一个灯泡,和许多很短的电线.如何只上下楼一次就能确定电线线头的对应关系? 答案:在下面把2,3连在一起,把4到6全连在一起,把7到10全连在一起,等等,这样你就把电线分成了6个"等价类",大小分别为1, 2, 3, 4, 5, 6.然后到楼顶,测出哪根线和其它所有电线都不相连,哪些线和另外一根相连,哪些线和另外两