问题内容
一辆加满油的汽车欲行驶到m公里外的终点,旅途中有若干加油站,并且每个加油站距离起点的公里数已知,输入格式:汽车加满油后可行驶n公里。如何用最少的加油次数到达目的地。
输入格式:
第一行输入终点公里数m,和汽车加满油可行驶的公里数n,以及加油站的个数k。第二行输入k个整数分别代表从起点到终点的k个加油站距离起点的公里数。
输出格式:
输出最少的加油次数。
输入样例:
在这里给出一组输入。例如:
10 6 3
2 5 9
输出样哩:
在这里给出相应的输出。例如:
1
贪心法思想
贪心法的基本思路是在对问题求解时总是做出在当前看来是最好的选择,也就是说贪心法不从整体最优上加以考虑,所做出的仅是在某种意义上的局部最优解。每一次贪心选择都将所求问题简化为规模更小的子问题,并期望通过每次所做的局部最优选择产生出一个全局最优解。
问题分析
汽车加油问题采用贪心法,将尽量减少加油次数,细分为子问题:若汽车在当前加油站的剩余油量能支撑其行驶到达下一加油站,则在当前加油站不加油。若在当前加油站剩下的汽油不足以到达下一加油站,则加油,累加计算总加油次数。
题目要求输入每个加油站距离起点的距离,把它转换为每个加油站之间的距离数组会更好理解。
代码
#include<iostream>
using namespace std;
int main()
{
int m;
int n;
int k;
int sum = 0; //加油总次数
cin>>m>>n>>k;
int a[k];
for(int i=0;i<k;i++)
cin>>a[i]; //每个加油站距离起点的距离。
int b[k+1]; //创建每个加油站之间的距离数组
b[0]=a[0]; //第一个加油站与起点之间的距离
b[k]=m-a[k-1]; //最后一个加油站与终点之间的距离
if(b[0]>n)
return 0; //从起点到不了第一个加油站的情况
int thisMile=n-b[0]; //定义当前油量还能行驶的距离,并赋初值,即在经过第一个加油站时还能
行驶的距离
for(int i=1;i<n;i++)
{
b[i]=a[i]-a[i-1]; //计算除第一个和最后一个加油站以外每个相邻加油站之间的距离。
}
for(int i=1;i<k;i++)
{
if(thisMile<b[i]) //不能走到下一个加油站,在当前站加油
{
thisMile = n-b[i];
++sum; //加油次数增加1
}
else{
thisMile = thisMile-b[i];
}
}
cout<<sum;
return 0;
}