假设有一辆车,它的油箱恰好和一个油桶一样大,而且车上恰好可以装载一个桶。假设一桶油可以让车开100公里。现在在起点,车装满了油,另外起点还有100桶油。问:这车最远能离开起点多远?
说明:汽车上最多带一个桶,不管这个桶里装了多少油,不能再带另外的空桶。桶中的油可以倒入油箱中,油箱中的油也可以倒入桶中。

解决方案 »

  1.   

    f_acme(沧海一声笑) 回答太傻瓜了。DelphiGuy() ( 的思路是正确的。大家继续,能做出答案吗/
      

  2.   

    101     50          25        12         6         3         2       00 ----- 50km ------100km ----150km -----200km ----250km ----275km---475km
      

  3.   

    我的思路是这样的,请诛高手指正:
    每次花1桶的油,把所有的油桶搬到一个位置,然后再花一桶,搬到下一个位置,以此类推跑的最远~~~~~~~~~
    结合题目来说,因为刚开始起点有100桶油,车上能装1桶,因此需要搬运99桶,而且根据我的思想,是要花整整1桶油来搬运这99桶,不能多浪费,也不能少浪费。
    假设第一个搬运点离起点距离为x,那么则有如下方程:
    (99*2+1)x = 100  //搬99桶油要跑99个来回,因此是99*2,跑完这99个来回之后,汽车是停在起点的,因此还要再加1个x才能跑到摆放点。而所有这些消耗的油,加起来应该等于1桶,也就是100。
    因此可得到,第一个摆放点距离起点为100/199公里。换句话说,汽车已经前进了100/199公里了。然后根据算法,计算下一个摆放点离这个摆放点的距离,也就是汽车继续前进的距离。随着油桶的减少,搬运次数也会随之减少,因此相邻两摆放点之间的距离势必会越来越大,汽车也就越跑越远~~~~~~~~以上就是我的算法,程序高手可以写程序实现一下,我不会写程序,呵呵。
      

  4.   

    andycpp(幻瞳)  算发有漏洞浪费了汽油 没发挥油箱最大装油量比如 89桶汽油(车油箱是满的) 放到50公里处 
    方法1: 就是 1次消耗1桶送1桶  结果是50公里处有45桶油 车没油了
    方法2: 先运到25公里处 就是25公里处60桶汽油 车没油了
    再运到50公里处 结果是 40桶汽油 车没油了方法1 2 不同的就是 选择地点
    不同的阶段 可以把 汽油分为两种:
    1 被运送的汽油
    2 用来运送汽油的汽油(汽车消耗的油)
     汽油2被运送的话 就会减少效率
    选的点 越多 效率减少越大 
    其实 这题本身就是 消耗汽油的一个过程(100桶汽油 一定跑不到一万公里)
    就看怎么消耗少
      

  5.   

    fosfree(见习听众) 的引爆汽油桶的想法好。。佩服一个先。
      

  6.   

    我的思路是这样的,请诛高手指正:
    每次花1桶的油,把所有的油桶搬到一个位置,然后再花一桶,搬到下一个位置,以此类推跑的最远~~~~~~~~~
    结合题目来说,因为刚开始起点有100桶油,车上能装1桶,因此需要搬运99桶,而且根据我的思想,是要花整整1桶油来搬运这99桶,不能多浪费,也不能少浪费。
    假设第一个搬运点离起点距离为x,那么则有如下方程:
    (99*2+1)x = 100  //搬99桶油要跑99个来回,因此是99*2,跑完这99个来回之后,汽车是停在起点的,因此还要再加1个x才能跑到摆放点。而所有这些消耗的油,加起来应该等于1桶,也就是100。
    因此可得到,第一个摆放点距离起点为100/199公里。换句话说,汽车已经前进了100/199公里了。然后根据算法,计算下一个摆放点离这个摆放点的距离,也就是汽车继续前进的距离。随着油桶的减少,搬运次数也会随之减少,因此相邻两摆放点之间的距离势必会越来越大,汽车也就越跑越远~~~~~~~~在起点应该会出现很多空桶得 不用搬
      

  7.   

    按照DelphiGuy() 的思想,可能需要近一百次的迭代吧!
    计算过程应该是很复杂的!
      

  8.   

    根据楼上所有各位的提示,我产生如下想法:
    最后一次肯定是200,耗油两桶,这个的证明只要费点时间好了。
    那么还有99桶如何耗才能最远?以99桶为初态,后面两桶不考虑。归结为如下数学表达式:
    假设在途中的任何两点a和b,在a点剩x桶油(初始为99),耗费i桶(i可以是1,2,3……,但不大于99)将其他的油运到b,a和b之间的路程为s,耗费99桶油所走的总的路为total(大家可以画下图,说的有点绕)。
    则:
    [ 2(x-i)-1 ] * s = 100 * i;//i桶油开100*i的路,这些路刚好是运x-i桶油到b点的路的总和。
    //若i=1就是andycpp(幻瞳) 的算法,但是i可以是2,3,乃至99
    由于可以多重循环,举例说就是先可以耗1桶将98桶搬到最远,然后再耗两桶将剩余的96桶搬到最远(也可以是任意的小于98的)……,所以问题很复杂,后果很严重。这样搞估计是NP问题了。
    但是我猜测应该是每次i都为1时搬最远,也就是andycpp(幻瞳) 的算法正确,我猜测应该可以证明,证明的方法是自然归纳法。
    也就是从1,1,1比1,2搬的更远(搬最后面的两桶)开始,然后
    while( 存在ix >1 )
    then 将 ix分成 1和(ix-1) 会搬的更远……我的数学不行,只是猜测而已。
    楼下达人继续,关注中……
      

  9.   

    lg(1/100)/lg(1/2)*50+200
    车装满油,载一桶油以后,能把这桶油载50公里放下再回来(来回共100公里刚好把油箱的油耗光)
    然后就可以在起点装满一桶油,又载一桶油到50公里处. 这样相当于要把油运到50公里处刚好
    需要耗一半的油.
    但是最后一趟不需要回到起点,因为所有油都装完了,这样最后一趟相当于少耗了50公里路程的油
    也就是1/2桶
    所以,第一次把所有油装到50公里处,剩下的油为102*(1/2)+1/2桶,这样算在在开始和结束时油的桶数都包括了车里面的油(开始时加上油箱里面的油,一共102桶,然后运50公里耗一半,还剩51桶
    ,但是最后一趟油箱还剩了半桶,所以就是剩了102*(1/2)+1/2桶
    然后再把剩下的油运50公里,这次剩下的油又是一半再加上半桶,也就是(102*(1/2)+1/2)*(1/2)+1/2
    不停重复,每次都在前面的基础上乘1/2再加1/2,当最后到剩下两桶油的时候,不需要再运了,直接可以跑200公里
    所以(102*(1/2)+1/2)(1/2)+1/2.......=2
    化简得102*(1/2)^n+(1/2)^n+(1/2)^(n-1)+(1/2)^(n-2)+.....+1/2=2
    n就是跑得次数(跑了多少个50公里)  算出n=lg(1/100)/lg(1/2),用这个数乘以50,再加上最后的200就可以啦
    楼主,我的答案对不对呀
      

  10.   

    101     50          25        12         6         3         2       00 ----- 50km ------100km ----150km -----200km ----250km ----275km---475km
      

  11.   

    大家有没有算出500km的,或者大于500km的?
      

  12.   

    正解来了,可惜迟了点 :-(
    用VB写的:
    Sub test()
        Dim i
        Dim k
        k = 200
        For i = 2 To 100
            k = k + 100 / (2 * i - 1)
        Next
        Debug.Print k
    End Sub答案为:428.434218930163
      

  13.   

    楼主,偶只想到了500km的方法,大于500Km的要怎么弄哦?
      

  14.   

    tiaoci(我挑刺,我快乐) 的思路很正确,要找到最远的距离。大家要考虑什么?总油量是一定的,折返的次数越少跑得就越远。
      

  15.   

    呵呵,被偶google到另外一个帖子,
    http://bbs.taisha.org/viewthread.php?tid=237877&extra=&page=1
      

  16.   

    哦,地址paste错了,应该是http://bbs.taisha.org/viewthread.php?tid=237877
      

  17.   

    (n+1)*n/2*X=100*102 
    min(n), max(X) 寻最优解
      

  18.   

    TO:milkbottle(奶瓶->好好学习,天天向上) youngmo1(小莫) 
    应该如下:
    101     50.5        25        12.5       6         3.5       2       00 ----- 50km ------100km ----150km -----200km ----250km ----300km---500km答案为:500km
      

  19.   

    我的算法有点偏激,请不要见怪按我的算法,能行驶多远还得开油桶的底直径、容量与堆放结构以及油在当地的挥发系数。
    设油桶直径为R,那么行驶距离R所需要用油为R/100,一桶油按这样的加油法能加 10000/R次(100桶油加1000000/R次)
    设实验当地油的挥发系数为I(min/L)、设每次加油需要S秒。
    设油箱的容积为L,那么油箱中的油的挥发后剩余总量为(L -(1000000*I/60*R))[(1000000*I/60*R)< L]
    那么总挥发油量为(1000000*I/60*R)+ ((1000000*I/60*R))。好,开始出发:
    车辆行驶距离R后,去最后一桶油加R/100,然后把这桶油放到油桶堆放位置的第一位。以次循环操作。
    那么车辆行驶的总距离是:1010000*L/R - 10000000I/3R^2
    所以在数学条件下,车辆理论上可以开10100公里。
      

  20.   

    希望高手可以用JAVA来计算出来题解
    因为我们在JAVA板块中...
      

  21.   

    设实验当地油的挥发系数为I(min/L)、设每次加油需要S秒。
    设油箱的容积为L,那么油箱中的油的挥发后剩余总量为(L -(1000000*I/60*R))[(1000000*I/60*R)< L]
    那么总挥发油量为(1000000*I/60*R)+ ((1000000*I/60*R))。
    ------------------------
    great!你考虑得很周全,连挥发都考虑到了!
      

  22.   

    把所有的油看作是101桶,每桶100KM。
    1、每次只走50KM,把所有的油运到下一个点,这个时候剩50.5桶。
    2、类推,第二次再走50KM,剩25桶;
    3,第三次,50KM,剩12.5桶;
    4、第四次,50KM,剩6桶;
    5、第五次,50KM,剩3桶;
    6、第六次,50KM,剩1.5桶;
    7、走75KM
    总计:325KM这样好象比较浪费,总共浪费了1桶油,如果把每次走的路程缩短一点,没有浪费的话会更长
      

  23.   

    十分赞同 zhangkewang(旺旺) 的说法,最后剩两桶走200KM
    101   50.5 25 12.5 6 3.5 2 0
      50   +  50+50+50+50+50+100+100=500KM
      

  24.   

    先简化一下,车加满油,起点有一桶油,可以跑多远?200公里。
    起点有两桶油呢?把一桶油搬出50公里,折返把另一桶油加满油箱?还是只能跑200公里。
    因此必须花油箱里一桶油的代价把两桶油往前搬。把两桶油搬到x*(2*2-1) = 100,x = 33.3公里的地方,这样能跑出233.3公里。
    三桶油呢?照上面的方法,把三桶油搬到x*(3*2-1) = 100,x = 20公里的地方,加满油,剩两桶,再按两桶油跑的距离,一共20+33.3+200=253.3公里,但这不是最优解,最优解是:
    把一桶油带出50公里,折返,地上一桶加满油箱,带上仅剩的一桶,开到50公里处,这时地上一桶油,车上一桶油,油箱里的油够跑50公里。按地上两桶油的跑法,把两桶油望前带x*(2*2-1) = 50,x = 16.6公里,然后就可以跑200公里了,一共50+16.6+200=266.6公里。
    所以按地上油桶奇偶数的不同,要采取不同的跑法。
      

  25.   

    public class TruckProblem {
        public static void main(String[] args) {
            double distance = 0; //初始距离
            int petro = 100; //初始的100桶油
            for (int i = petro; i > 0; i--) {
                distance += 100 / (petro + petro - 1); //每一桶油能把剩下的油搬运的距离
                petro--; //油的数量减少1
            }
            distance += 100; //最后油箱中的油可以跑100KM
            System.out.println("Distance : " + distance);
        }
    }
    参考了楼上兄弟的“一桶油能走多远”的思路,写成了这个程序,不知道逻辑对不对,欢迎大家拍砖。
    差点儿忘了,最后的距离是375公里,楼上有位兄弟已经说了。
      

  26.   

    X:第一次移动全部油后剩余的油
    Y:第一次移动全部油的路程 
    Y/100=100100/X-1 
    求X,Y的值都最大 
      

  27.   

    我认为应该得500KM
    50桶 50KM;25桶 100KM;13桶 150KM;7桶  200KM;4桶  250KM;2桶  300KM直接走了。所以答案500KM。解决方案是根据古埃及的一道解牛的题:19只牛一个人分得1/2;一个人分得1/4;最后一人得1/5
    一般只需分就行了。但是只要把19分成1/2显然不可以的。这时古埃及人的解法是把19+1。这样就可以分了。按一般的分法越分应该越接近10、5、4的答案。所以我觉得应该得500KM不知道lz这是不是正解。欢迎各位朋友指正。谢谢
      

  28.   

    将终点定为A0,终点的前一个点为A1,依次类推,A2,A3,...起点为An
    A1到A0间的距离为F1, 依次类推,F2, F3...Fn
    A0----A1----A2----A3...An
       F1    F2    F3  ...1、很明显,当车到A2时,车上油箱为空,A2处有2桶油,F1为100,F2为100;
    2、A2处的2桶油,必须由A3处运到。
       运送时必须走过的路程为A3->A2->A3->A2,即3*F3。
       这个过程中共有两次是由A3出发,每次出发时油箱里加满油,又带一桶油,总共可以带4桶油(A3处要有四桶油),A2处留下两桶,剩下的2桶油跑了3*F3的路程,可计算出F3=200/3=66.7;
    3、同样,可以计算出A4处有8桶油,F4 = 400/7 = 57.14;
                       A5处有16桶,F5 =800/15 = 53.33;
                       A6处有32桶, F6 = 1600/31 = 51.61;
                       A7处有64桶,F7 = 3200/63 = 50.79;
    4、起点(A8)有101桶,将64桶油由A8运至A7,F8 = (101-64)*100/(2*64-1) = 29.13   F1+...+F8 = 508.7
      

  29.   

    milkbottle(奶瓶->好好学习,天天向上) 应该是对的
      

  30.   

    先说一下这道题里的几个关键:
    1、搬到最后结果应该是车没油,地上剩两桶油,能跑出200公里。
    2、车里的油也算一桶,当油桶数是奇数的时候,花一桶油代价把另一桶油搬到50公里处是不划算的,例如剩3桶油,一桶加满油箱,带上一桶开到50公里处放下,回来,剩下的一桶正好加满油箱,这时车在起点,总油量是2桶,结果3桶油只能跑200公里。因此当油桶是奇数的时候,应该花一桶油的代价把剩下的油桶往前搬,设剩下的油桶数为n,搬的距离为x,则x*(2n-1)=100,x = 100/(2n-1),只所以减1是因为搬最后一桶油不需要返回了。3桶油耗一桶把剩下两桶搬到100/(2*2-1)=33.3公里处,能跑出233.3公里。
    3、油桶数是偶数,应该耗一桶油把另一桶油搬到50公里处,把所有油桶搬到位,车里是还剩50公里的油量的,因为不需要返回。
    4、按3的规则,例如剩6桶油,搬出50公里是剩3.5桶油,这个.5也算一桶油,因此油桶数还是偶数,仍然按3的规则搬,不过搬到位车里已经没油了。6->3.5->2按以上规则:
    公里数:      100/199=0.5   50     50/99=0.5  50
    油桶数:101   100           50.5   50         25.5剩25.5桶油的时候有个分歧,是花1.5桶油的代价把24桶油往前搬还是把13桶油搬出50公里,分别算一下:
    1.5桶油搬24桶:
    公里数:    |150/47=3.19|50  |50/23=2.17|50 |50/11=4.54|50 |50|200
    油桶数:25.5|24         |12.5|12        |6.5|6         |3.5|2 |搬出50公里:
    公里数:    |50|100/23=4.34|50 |50/11=4.54|50 |50|200
    油桶数:25.5|13|12         |6.5|6         |3.5|2最后最大值是:0.5+50+0.5+50+3.19+50+2.17+50+4.54+50+50+200 = 510.9公里由于25.5桶油的分歧,我觉得这可能还不是最优解,期望有人能算出跑得更远的方法。