汽车加油问题

一、实验目的

    1、理解并掌握贪心算法,学会运用贪心算法解决问题。

2、掌握贪心算法的基本要素:最优子结构性质和贪心选择性。

二、问题描述

    一辆汽车加满油后可以行驶nkm。旅途中有若干个加油站。设计一个有效算法,指出应在那些加油站停靠加油, 使沿途的加油次数最少。并证明算法能产生一个最优解。

    对于给定的n和k个加油站位置,计算最少加油次数。

数据输入:第一行有2个正整数n和k,表示汽车加满油后可行驶n公里,且旅途中有k个加油站。接下来的1行中,有k+1 个整数,表示第k个加油站与第k-1 个加油站之间的距离。第0 个加油站表示出发地,汽车已加满油。第k+1 个加油站表示目的地。

结果输出:输出编程计算出的最少加油次数。如果无法到达目的地,则输出”NoSolution”。

三、问题分析

   该问题运用贪心算法计算最小加油次数。将问题分为以下几种情况考虑:

(1)始点与终点的距离不超过nkm,则不需要加油。输出0。

(2)始点与终点的距离超过nkm,且每两个加油站之间的距离不超过nkm,则可以达到目的地。

(3)某两个加油站之间的距离大于nkm,则无法达到目的地,输出“No Solution”。

实现:在每一个加油站出发前先做出判断,判断到下一个加油站的路程是否大于nkm,若大于则直接输出“No Solution”的不可达信息。否则再判断当前汽车中的油能否支持汽车到达下一加油站,若能支持则继续出发,不能则加油。

#include <iostream>

using namespace std;

 

int main()

{

          int n,k,num=0;

          cin>>n>>k;//输入加满油可行驶的路程和加油站个数

          int m=n;

          int a[k+1];

          for(int i=0;i<k+1;i++)

              cin>>a[i];//输入加油站之间的距离

           for(inti=0;i<k+1;i++)

           {

//判断是否能达到目的地

              if(n<a[i])

              {

                cout<<"No Solution";

                return 0;

              }

//判断剩余的油是否足够到达下一站

              elseif(m>=a[i])

                  m-=a[i];

              else

{

//加油

                  m=n;

                  num++;

                  i--;

              }

           }

           cout<<num;

           return0;

}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值