面试题:火车运煤问题
你是山西的一个煤老板,你在矿区开采了有3000吨煤需要运送到市场上去卖,从你的矿区到市场有1000公里,你手里有一列烧煤的火车,这个火车最多只能装1000吨煤,且其能耗比较大——每一公里需要耗一吨煤。请问,作为一个懂编程的煤老板的你,你会怎么运送才能运最多的煤到集市?
[解决办法]
这是理解方式的问题
你的意思是驴必须一次穿越1000公里,那样就真的回不来了
如果路程是一部分一部分走,是能带萝卜出沙漠的,可以看下面的示意图,
⑤⑤③③③①①①①①
这一串数字表示整个路程,其中:
⑤表示须走五趟的路。
往返2次共四趟,第3次过去就不返回了,共五趟。
计算后最佳距离为200公里、消耗1000根萝卜,即剩下800公里路程、2000根萝卜;
③表示须走三趟的路。
往返1次共两趟,第2次过去就不返回了,共三趟。
计算后最佳距离为333公里、消耗999根萝卜,即剩下467公里路程、1001根萝卜;
①表示只须走一趟的路。
过去就不返回了,共一趟。
一次驼1000根直接越过剩下的路程。
注:这里扔掉了一根萝卜,或者商人吃掉了一根,反正不需要为了一根萝卜,再返回了。
楼主看看 把驴子换成火车 萝卜换成煤
[解决办法]
骆驼吃香蕉的问题
主要解决思路:
①骆驼先载上1000个香蕉 走到某一处,然后放一些香蕉在路上某处。
再带上一些香蕉 边走边吃返回到起点
②重复上述过程,直到还剩余香蕉全部都搬运到路上某处.
③最后重复①②过程
现在的问题就出现了 走到某处? 到底走到哪里呢?
一开始,有3000个香蕉 那么在通往终点的方向上的同一段路 要走3次
该段路程反方向要走2次
如果只剩了2000个香蕉 那么在通往终点的方向上的同一段路 要走2次
该段路程反方向要走1次
很显然 可以用剩余香蕉的数量来分隔。
从3000个香蕉到刚好剩余2000个香蕉
消耗了1000个香蕉(骆驼行走路程为1000m)
在同一段路要走3+2=5 次
那么这段路只有 1000/5=200m 此时走过200m 剩余1000个香蕉
从2000个香蕉到1000个
又消耗了1000个香蕉(骆驼行走路程为1000m)
根据上述推论 在在同一段路要走1+2=3 次
那么又走过1000/3=333.3m
最后剩余1000个
距离终点只有1000-200-333.3=466.7m
那么只用消耗467个香蕉
最后剩余1000-467=533个香蕉
见http://cart55free99.blog.163.com/blog/static/853598512010111574812417/
[解决办法]
蛋疼算了一下极限,也就是假设起点有无限吨煤
那么能运到的就是1000*(1/3+1/5+1/7+.....+1/(2n+1))
设数列
Sn=1/3+1/5+1/7+.....+1/(2n+1)
S1=1/2+1/4+1/6+1/8+.....+1/2n
取欧拉常数γ=0.5772
显然Sn+S1+1就是调和数列的和——0.5772+ln(n)
而S1*2也是调和数列
解得Sn=ln(n)/2-0.7139
这是一个发散数列
总之结论就是可以运送无限多的煤到目的地。
[解决办法]