卡车通过沙漠。。。。

12s 2003-11-25 09:43:58
一量重型卡车欲通过1000公里的沙漠,卡车耗油量为1公升/公里,卡车总载油量为
500公升,显然卡车装一次油是通过不了沙漠的。因此司机必须在沿途设立几个储
油点,使卡车能顺利通过沙漠。试问司机如何建这些储油点?每个储油点应该储多
少升油?才能使用卡车以最小耗油量的代价通过沙漠?
...全文
612 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
omrhal 2003-11-26
  • 打赏
  • 举报
回复
看过多次了,给你整理下
/*问题的描述:

一辆重型卡车欲穿过1000公里的沙漠,卡车耗油为1公升每公里,
卡车总载油能力为500公升。显然卡车装一次油是过不了沙漠的。
因此司机必须设法在沿途建立几个储油点,使卡车能顺利穿越沙漠,
试问司机如何建立这些储油点?每一储油点应存多少汽油,
才能使卡车以消耗最少的汽油代价通过沙漠?

算法描述:

从终点到起点1K公里.
我门从终点开始考虑,
也就是把终点到起点是:
I0……I1……I2……In

首先我们考虑是从I1到I0需要的油是500公升,也就是我门在I1的位置存放500公升的汽油才能保证车子到终点。

我门把两个I之间的距离写为S[i],耗油量为V[i];
这样第一步我们知道了I0……I1之间
S1=500公里,V1=500公升。

下一步,从I1……I2之间,我们必须至少要从I2处向I1开两趟车子(单向)才能保证I1处的储存量500公升。
这样因为我们是从I2开向I1处,所以,来回加(双向)在一起应该至少是3趟才能保证I1处有500公升的汽油。
能保证3次往返最低的耗油量就是500公升,
那么我们来求出3次往返的500公升耗油量的距离就是:S2=500 / 3。
I0……I2的距离就是:S1+S2=500+500/3
而同时在I2处的储存油量为:V2=500公升+500公升=1000公升

继续向下考虑,从I2……I3之间,保证I2处有1000公升的汽油,我门必须要卡车最少从I3向I2开3趟(单趟),来回就是5趟。路上的耗油量是500公升,也就是我门在I3处存放1500公升汽油。
那么我们来回的距离是:S3=500/5。
I0……I3的距离是:S1+S2+S3=500+500/2+500/3。
同时I3的储存油量是:1500公升。

由此推断:
如果需要i处储存油,那么要i*500的储存量。
车子从i+1到I处(单向)的至少要i次。加上返回的次数一共是2*i—1次。
而这2*i—1次的最小耗油量是500公升。
那么Si的距离就是500/(2*i—1)。

最后i=n到开始地点的
距离是1000-sum(Sn) (i为1、2、……求他们的和,也就是前面的总路程。)
储存油:n*500。

车子至少要从起点开n+1次满油到n处。加上返回的,一共是2n+1次。

我们2n+1次的耗油量是(1000-sum(Sn))*(2n+1)
[注:就是距离*往返次数=500和前面的500/往返次数=距离是一样的。]
我们起点的油量Vn+(1000-sum(Sn))*(2n+1)。
Vn就是从n点到终点I0总的需求油量。

*/
//具体程序:

#include <iostream.h>

void main(){

int dis[10],oil[10],i;

i=1;

dis[1]=500/(2*i-1);

oil[1]=i*500;

while(dis[i]<1000){

dis[i+1]=dis[i]+500/(2*i+1);

oil[i+1]=500+oil[i];

i++;

}

while(i-->1)

cout<<"\ndis["<<i<<"]="<<1000-dis[i]<<" oil[<<"<<i<<"]="<<oil[i];

}
ZhangYv 2003-11-25
  • 打赏
  • 举报
回复
http://search.csdn.net/expert/topic/6/603/2003/3/19/1552292.htm
http://expert.csdn.net/Expert/topic/2490/2490703.xml?temp=.4793512

33,029

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧