#算法#No.1 会编程的煤老板

题目1:你是山西的一个煤老板,你在矿区开采了有3000吨煤需要运送到市场上去卖,从你的矿区到市场有1000公里,你手里有一列烧煤的火车,这个火车最多只能装1000吨煤,且其能耗比较大——每一公里需要耗一吨煤。请问,作为一个懂编程的煤老板的你,你会怎么运送才能运最多的煤到集市?

题目2:如果车子每次只能运500吨呢?

解题思路:因为汽车往返均需要消耗煤,因此我们必须尽量减少往返次数,从而每次运煤出发时均需装满车辆并且最后一次只出发,不返回。

我们通过前几趟的运送,在中途设置几个中转点,最后一趟的时候能通过沿途的不断补给,填充汽车的消耗,使得车上的煤已知维持在填满状态(1000吨),这样车最终剩下的煤为1000-最后一个中转点和终点的距离(1000-Tn)=Tn。

先来解第一题,因为总共有3000吨,所以肯定要分3次运输(3000/1000=3),

第一趟:假设第一个中转点T1距离起点X公里,则在T1卸下(1000-2X)吨,用剩下的煤返回

第二趟:运1000吨煤,(此时T0剩余1000吨)到达第一个中转点T1时补充之前消耗的X吨(此时T1剩余1000-2X-X吨),继续前行,到达中转点T2,(设T1T2的距离为Y公里),则此时车上剩余1000-Y吨,卸下1000-2Y吨(T2剩余1000-2Y吨),用剩下的煤返回到T1,车上的煤耗尽,在T1点补充X吨(此时T1剩余 1000- 2X-X-X吨),返回T0。

第三趟:从T0出发,装上剩余的1000吨,(此时T0剩余0吨)到达T1,补充消耗的X吨(此时T1吨剩余1000-2X-X-X-X吨),到达T2点,补充消耗的Y吨(此时T2剩余1000-2Y-Y吨),继续前行至终点。这时剩下的煤即为最终剩下的吨数。

解答:因为最终每个中转点剩余的煤为0,所以1000-2X-X-X-X=0 且1000-2Y-Y=0,解得X=200公里,且Y=1000/3公里。因此最后剩下的煤为1000-(1000-200-1000/3)=200+1000/3=533.33吨。


我们再回头来看这个算法,我们发现T0T1的路程走了5次,T1T2的路程走了3次,T2T3的路程走了1次。

因此我们可以换个角度

第一步:第一趟运送的煤负责维持T0T1间消耗的煤(共计2*3-1=5趟)

第二步:第二趟运送的煤负责维持T1T2间消耗的煤(共计2*2-1=3趟)

第三步:第三趟运送的煤负责维持T2T3间消耗的煤(共计2*1-1=5趟)

为此我们可以发现

T0T1=1000/5公里,T1T2=1000/3公里,T2T3=1000-T0T1-T1T2。 ------->>>最后剩下533.3吨

 

所以我们可以总结出该类型题目的通用解法:

Step1:算出总共需要汽车运输n趟,则需要设置n-1个(最后一趟直接到达终点)中转点。

Step2:则相邻两个中转点的距离(起点视为T0)=满载吨数W/汽车在该段通行次数。即T0T1=W/(2n-1),T1T2=W/(2n-3),T2T3=W/(2n-5).......(Tn-2)(Tn-1)=W/3

Step3:最后剩下的吨数为W-(W-T0T1-T1T2-......-(Tn-2)(Tn-1))=T0T1+T1T2+T2T3+......(Tn-2)(Tn-1)。


现在我们再来看第二小题:

Step1:总共需要3000/500-1=5个中转点

Step2:T0T1=500/11,T1T2=500/9,T2T3=500/7,T3T4=500/5,T4T5=500/3

Step3:最后剩下的煤为500*(1/11+1/9+1/7+1/5)吨


你可能感兴趣的:(面试题,算法)