由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 问个题,火车运煤的DP解法
相关主题
leetcode pow runtime error??判断树为binary search tree 有多少种解法
Pow有没有比log(n)更好点的解法?两道面试题
一道google 经典题请大家谈谈应对简单题目的策略吧
解一道 GOOGLE 面试题 ...onsite完了求bless~(附带点面经)
一点总结,抛砖引玉问个经典问题的improvement
[合集] 面试题求解请教一道题目
问几个老算法题的最佳解法travelling salemen problem有什么好的解法吗?
请教背包问题。rand5 -> rand7的解法?
相关话题的讨论汇总
话题: localmax话题: double话题: totalleft话题: result话题: 1000
进入JobHunting版参与讨论
1 (共1页)
e*****e
发帖数: 3
1
题目如下,在coolshell上看到
http://coolshell.cn/articles/4429.html
你是山西的一个煤老板,你在矿区开采了有3000吨煤需要运送到市场上去卖,从你的矿
区到市场有1000公里,你手里有一列烧煤的火车,这个火车最多只能装1000吨煤,且其
能耗比较大——每一公里需要耗一吨煤。请问,作为一个懂编程的煤老板的你,你会怎
么运送才能运最多的煤到集市?
Leetcode 上有一道类似的题
http://leetcode.com/2011/01/nuts-in-oasis-interview-question-fr
这题如何用dp解?我一开始想用一个m[1000,3000]的数组,保存d距离运n吨煤最多剩下
的煤。后来发现不对,因为没考虑火车最后要停在终点一边。
f*******t
发帖数: 7549
2
不科学啊,耗煤的速度应该跟当前火车上煤的重量成正比,而不是固定的值
z***2
发帖数: 66
3
really? dp can work on this problem?
the train need to go back and forth....@@
z*******g
发帖数: 18
4
我的方法是
首先:分三次把煤运到离起始地200公里的地方A。前两次每次卸掉600吨的煤回去,
最后一次到A的时候一共有煤2000吨。200是从方程 1000-2x+1000-2x+1000-x = 2000
得到的。
现在这个问题就转变为另外一个问题,一共有2000吨煤,怎么运最多的煤到800公里以
外的地方。同样的思路,先运到一个地方卸煤,然后再装煤,要求是最后剩的煤只有
1000吨,这样才可以最后一次运到目的地。这个地点可以解下面这个方程
1000-2x + 1000 - x = 1000, x = 1000/3。
最后我们的问题变为,有1000吨的煤,离目的地1000-200-1000/3 = 1400/3 公里,怎
么运最多的煤。这个简单,一车直接把所有的煤拖过去,这样到达目的地就会有
1000-1400/3 = 1600/3吨的煤。
c********t
发帖数: 5706
5
对的。我是这么推得。
1 假设我们要把3000吨先运到一个中间点 x0, 因为3000吨要分3次运,第一二次都要往
返,第三次单程,所以这段距离要走5次。
2.如果发现当只剩下2000吨以下时,就只需要分两次运了,剩下的距离最多只用走3次
。所以要求x0尽量小,即只用1000吨,1000/5=200
3。同理可推第二个距离为 1000/3=333
4,剩下1000吨跑 467距离,剩余533吨

【在 z*******g 的大作中提到】
: 我的方法是
: 首先:分三次把煤运到离起始地200公里的地方A。前两次每次卸掉600吨的煤回去,
: 最后一次到A的时候一共有煤2000吨。200是从方程 1000-2x+1000-2x+1000-x = 2000
: 得到的。
: 现在这个问题就转变为另外一个问题,一共有2000吨煤,怎么运最多的煤到800公里以
: 外的地方。同样的思路,先运到一个地方卸煤,然后再装煤,要求是最后剩的煤只有
: 1000吨,这样才可以最后一次运到目的地。这个地点可以解下面这个方程
: 1000-2x + 1000 - x = 1000, x = 1000/3。
: 最后我们的问题变为,有1000吨的煤,离目的地1000-200-1000/3 = 1400/3 公里,怎
: 么运最多的煤。这个简单,一车直接把所有的煤拖过去,这样到达目的地就会有

z***2
发帖数: 66
6
佩服!
import java.util.*;
class train {
public static void main(String[] args) {
double table[]=new double [10001];

table[0]=3000.0;

for(int i =1; i double localMax=-1.0;
double curDistance= i/10+ (double)(i%10)*1/10;
//System.out.println(curDistance);
for(int j=0; j
double totalLeft = table[j];
double prevDistance= j/10+ (double)(j%10)*1/10;
double distance= curDistance-prevDistance;

if(totalLeft>=2000){
double result=totalLeft- 5*distance;
localMax=Math.max(localMax,result);
}

else if(totalLeft>=1000){
double result=totalLeft- 3*distance;
localMax=Math.max(localMax,result);
}

else{
double result=totalLeft- distance;
localMax=Math.max(localMax,result);
}
}
table[i]=localMax;
}
System.out.println(table[10000]);
}
}
G****A
发帖数: 4160
7
这个方法有个隐含assumption: "所有货物先运到同一个(非终点)地点"。虽然我也认为
运到不同地点不会lead to更好结果。但是需要证明.

【在 z*******g 的大作中提到】
: 我的方法是
: 首先:分三次把煤运到离起始地200公里的地方A。前两次每次卸掉600吨的煤回去,
: 最后一次到A的时候一共有煤2000吨。200是从方程 1000-2x+1000-2x+1000-x = 2000
: 得到的。
: 现在这个问题就转变为另外一个问题,一共有2000吨煤,怎么运最多的煤到800公里以
: 外的地方。同样的思路,先运到一个地方卸煤,然后再装煤,要求是最后剩的煤只有
: 1000吨,这样才可以最后一次运到目的地。这个地点可以解下面这个方程
: 1000-2x + 1000 - x = 1000, x = 1000/3。
: 最后我们的问题变为,有1000吨的煤,离目的地1000-200-1000/3 = 1400/3 公里,怎
: 么运最多的煤。这个简单,一车直接把所有的煤拖过去,这样到达目的地就会有

z***2
发帖数: 66
8
同問一下, 飞机加油问题 可以DP 解決嗎?
已知
每个飞机只有一个油箱
飞机之间可以相互加油(注意是相互,没有加油机)
一箱油可供一架飞机绕地球飞半圈
所有飞机从同一机场起飞,而且必须都安全返回机场,不允许中途降落,中间没有飞机场
问题:
为使至少一架飞机绕地球一圈回到起飞时的飞机场,至少需要出动几架次飞机?
1 (共1页)
进入JobHunting版参与讨论
相关主题
rand5 -> rand7的解法?一点总结,抛砖引玉
问一个老题目[合集] 面试题求解
careercup上面的题目问几个老算法题的最佳解法
请教一题,求两个不等长的有序数组的median请教背包问题。
leetcode pow runtime error??判断树为binary search tree 有多少种解法
Pow有没有比log(n)更好点的解法?两道面试题
一道google 经典题请大家谈谈应对简单题目的策略吧
解一道 GOOGLE 面试题 ...onsite完了求bless~(附带点面经)
相关话题的讨论汇总
话题: localmax话题: double话题: totalleft话题: result话题: 1000