问题描述:
用一辆吉普车穿越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 <iostream>
#include<stdio.h>
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;
}
相关问题:
飞机加油问题:
问题:
为使至少一架飞机绕地球一圈回到起飞时的飞机场,至少需要出动几架飞机?(所有飞机从同一机场起飞,而且必须安全返回机场,不允许中途降落,中间没有飞机场)