穿越沙漠问题

问题描述:

用一辆吉普车穿越1000公里的沙漠。吉普车的总装油量为500加仑,耗油率为1加仑/公里。由于沙漠中没有油库,必须先用这辆车在沙漠中建立临时油库。该吉普车以最少的耗油量穿越沙漠,应在什么地方建油库,以及各处的贮油量。

分析:

注意:每次吉普车都应该满载,贮存一部门油量,再返回,正好消耗完,并且下一个加油点建好时,上一个加油点的贮存油量正好消耗完毕。所以,每个加油点的贮存油量都应该是吉普车载油量的整数倍。而且,每一个加油点的贮存油量应该是下一个加油点贮存油量和吉普车未建设下一个加油点所消耗油量的和。

根据耗油量最少目标的分析,下面从后向前分段讨论。(倒着分析)

第一个加油点是距离终点500公里的地方,贮存油量500加仑;

第二个加油点是距离第一个加油点500/3的地方,贮存油量1000加仑;

原因:为向第一个加油点送500加仑的油,吉普车应该往返3程(应该是奇数),考虑最少耗油量,第二个加油点应该贮存油量是500+500;距离第一个加油点的距离应该是500/3公里。

第三个加油点是距离第二个加油点500/5的地方,贮存油量1500加仑;

为向第二个加油点送1000加仑的油量,吉普车应该往返5程,考虑最少耗油量,第三个加油点应该贮存油量1000+500,距离第二个加油点的距离应该是500/5;

依次类推:

当吉普车往返15程第八个加油点),总距离应该超过1000公里,最终完成穿越沙漠。


代码:

#include
#include
using namespace std;
int main()
{
    int dis,k,oil;
    dis=500;k=1;oil=500;
    while(dis<1000)
    {
        printf("%d %d %d\n",k,oil,1000-dis);
        k=k+1;
        dis=dis+500/(2*k+1);
        oil=500*k;
    }
    oil=500*(k-1)+(1000-dis)*(2*k-1);
    printf("%d %d %d\n",k,oil,dis);
    return 0;
}

相关问题:

飞机加油问题:

每个飞机只有一个油箱,飞机之间可以相互加油(注意是相互,没有加油机)一箱油可供一架飞机绕地球半圈,
问题:
为使至少一架飞机绕地球一圈回到起飞时的飞机场,至少需要出动几架飞机?(所有飞机从同一机场起飞,而且必须安全返回机场,不允许中途降落,中间没有飞机场)
分析:架解法(地区是圆的)
首先AB两架飞机同时满油起飞,消耗1/3的油量,即飞行1/6的距离,把B中的1/3的油加到A中,此时A满油;如果不加油可飞行1/2的距离点2,总共1/6+1/2=2/3的距离,此时距离远点还有1/3的距离,故可在飞机A距离点2还有1/3的距离时,从机场起飞满油飞机C迎向A,可在A空油时正好在点2相遇,C给A加1/3的油。当C起飞时,A从点1飞行了1/2-1/3=1/6的距离,此时B尚未未返回。

你可能感兴趣的:(基础练习集)