卡车穿越沙漠问题

来源:互联网 发布:linux tmp 目录权限 编辑:程序博客网 时间:2024/04/28 17:11

一辆重型卡车欲穿过1000公里的沙漠,卡车耗油为1升每公里。卡车总载油量为500升。显然卡车装一次油是过不了沙漠的,因此司机需要设法在沿途建立几个加油点,(加油点的油也是由卡车从起始点运送过去的)试问,司机如何建立这些储油点,每一储油点需要存多少汽油,使得最后耗油总量最少(包括运油的耗油等等)。

思路:设a[i]为倒数第i+1个储油点与终点的距离;b[i]为倒数第i+1个储油点储油量。

首先应该明确的是,若要耗油最少:

       1.卡车从一个站点到下一个站点再返回前一个站点的时候应该刚好耗完所带的油,所以每次从储油点带走的都是500升

        2.卡车走的路程要最少,也就是说,尽量少走重复的路线。

        3.考虑到每次带走的都是500升,所以,两站之间路上消耗的是500升的时候会走最少的重复的路。

        这时候,已经知道每两站之间储油量的关系是前一站比后一站多500升,两站之间往返的路程为500公里。从第一站考虑的话是未知的,但最后一站已经很容易看出来,a[0]=500;b[0]=500;按照前面的关系可以依次计算出来与终点的距离与储油量。

         先输出的是储油点的个数,然后是从起点开始的储油点与起点的距离及它的储油量。


#include<iostream>

#include<iomanip>
using namespace std;
int main()
{
              double a[100];
               int b[100];
              a[0]=500;
              b[0]=500;
               int i=0;
              while(a[i]<=1000)
              {
                              i++;
                             a[i]=500.0/(2.0*(i+1)-1.0)+a[i-1];
                             b[i]=500*(i+1);
              }
              cout<<i-1<<endl;
              for(i=i-1;i>=0;i--)
                             cout<<setw(10)<<fixed<<setprecision(4)<<1000-a[i]<<"    "<<b[i]<<endl;
}
原创粉丝点击