【小白的算法练习】火车拉煤算法

关于火车拉煤的一点思考

题目
很多人都看过这个题目,是一个煤老板有3000t的煤,他有一列火车,每次能载1000t的煤,能耗是1t煤每km,现在他要把煤运到1000km外的城里,问最多能剩多少煤
P.S.
本人是一个前端小白,学习算法的时候刚好看到了这个题目,所以写一篇记录下学习进度,大佬轻喷,萌新一起努力加油!
思考
首先直接走全程是肯定走不完的,所以中途肯定要停,设立补给站,最初的考虑是250KM处停下,每次留500t的煤,再在500KM出停,留下煤,最后一次走到终点,最后剩下250t的煤,还回不来,肯定不是最优解,所以参考了其他大佬的想法,有了后面的解法(有大佬帮忙看看理解的对不对么)。
总共3000t的煤,从出发地3次拉完,后面不再会出发点应该是最优的了,如果多拉会增加2倍的出发点到第一个补给站的距离,造成浪费;
补给站的设立
那么如此,第一个补给站就会经过2*(3000/1000)-1=5次,同理,第二个补给站会少一个来回,只要3次,再下一个就只有1次,就是终点了,所以需要在中间设立2个补给站,记为S1,S2;
最大剩余量
如果要最大剩余,那么最后一次从S2出发到终点时刚好有1000t的煤就是最大剩余了,设出发地到S1距离为x,S1到S2的距离为y
则有

	最大剩余 res =1000 - (1000-(x+y))* 能耗c  ⇒ x+y ①

这里能耗c是1t/km,故省略
对于全程则有

 	3000-5x-3y<=1000 ②

从补给站S1出发到S2
之前说S2刚好有1000t的煤时候是最大剩余,所以我们需要求x+y的最大值,
同理,在S1处最大剩余是2000t,则有

3000-5x<=2000 ③

x的取值区间是[0,200]

从S2到终点
与S1到S2相同,能够得到以下不等式

2000 - 3y <= 1000 ④

得y的取值区间是[333.33,666.66]

计算结果
将x和y的范围带入①②的约束条件,得

x=200,y=333.33 时

x+y有最大值533.33
代码
算法萌新,轻喷,轻喷

function alo(t,p,d,c){
    let count = Math.ceil(t/p);
    //不考虑回来,中途设立count-1个补给站
    let arr = [];
    while(count-1>0){
        arr.push((2*count-1));
        count--;
    }
    let sup = [];
    for(v of arr){
        sup.push(((p/v/c)).toFixed(2));//距离上一个补给点的距离
    }
    let res = p-(d-sum(sup))/c;
    return res;
}

function sum(arr){
    let res =0;
    for(v of arr){
        res+=parseFloat(v*100);
    }
    return res/100;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值