算法实现题 4-9 虚拟汽车加油问题
问题描述:
一辆虚拟汽车加满油后可以行驶n km。途中有若干个加油站。设计一个有效的算法,指出应在那个加油站停靠加油,使沿途加油次数最少。
算法设计:
给定n和k个加油站位置,计算最少加油次数。
数据输入:
第一行有两个整数n和k,表示汽车加满油后可行驶n km,且路途中有k个加油站。接下来的一行中有k+1个整数,表示第k个加油站与k-1个加油站之间的距离。第0个加油站表示处出发地,汽车已加满油,第k+1个加油站便是目的地。
输出结果:
将计算的最少加油次数输出,如果无法到达目的地,则输出“No Solution”
input
7 7
1 2 3 4 5 1 6 6
output
4
这张图片解释的很好,省去了好多话。
贪心选择性:
贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。
这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。
最优子结构:
当一个问题的最优解包含其子问题的最优解时,称此问题具有最有子结构性质。
基本步骤
从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解。当达到算法中的某一步不能再继续前进时,算法停止。
根据一个贪心选择性,每当到达一个加油站的时候,都要进行一次判断,看看剩余的油量能不能维持到下一个加油站。
如果可以的话,接着前行;如果不行的话,在当前加油站加满油在出发,此时更新油箱数据为已满。
#include<bits/stdc++.h>
using namespace std;
int main() {
int n,k;
cin>>n>>k;
int a[k+1];
for(int i=0; i<k+1; i++)
cin>>a[i];
bool f=0;
int sum=0,gas=n;//gas表示当前的油还可以走多少km
for(int i=0; i<k+1; i++) {
if(n<a[i]) f=1;
if(gas<a[i]) {
sum++;
gas=n;
}
gas=gas-a[i];
}
if(f)
cout<<"No Solution\n";
else
cout<<sum<<endl;
return 0;
}