7-1 汽车加油问题
题目来源:王晓东《算法设计与分析》
一辆汽车加满油后可行驶 n公里。旅途中有若干个加油站。设计一个有效算法,指出应
在哪些加油站停靠加油,使沿途加油次数最少。输入格式:
第一行有 2 个正整数n和 k(k<=1000 ),表示汽车加满油后可行驶n公里,且旅途中有 k个加油站。
第二行有 k+1 个整数,表示第 k 个加油站与第k-1 个加油站之间的距离。
第 0 个加油站表示出发地,汽车已加满油。
第 k+1 个加油站表示目的地。输出格式:
输出最少加油次数。如果无法到达目的地,则输出“No Solution!”。
输入样例:
7 7 1 2 3 4 5 1 6 6
输出样例:
4
贪心算法:不能得到整体最优解,而是局部最优解,关键在于贪心策略的选择
思路: 到站后的剩余油量能到下一站,不加油
到站后的剩余油量到不了下一站,若加了油后到得了,则加油,若加了油后还是到不了, 则退出
#include<iostream>
using namespace std;
//汽车加油问题
int main(){
int n; //汽车满油可行驶的距离
int k; //有几个加油站
int times; //加油次数
bool flag=true; //判断是否能到达终点
cin>>n>>k;
int distance[k+1]; //起点,k个加油站,终点 之间的距离
for(int i=0;i<=k;i++){
cin>>distance[i];
}
int oil=n; //到站后的剩余油量
for(int i=0;i<k;i++){
oil=oil-distance[i];
if(oil>=distance[i+1]){ //到站后的剩余油量 可以到下一站 不加油
continue;
}
else{ //到站后的剩余油量 到不了下一站
if((oil+n)>distance[i+1]){ //加了油后能到下一站 加
times++;
oil=n;
}
else{ //加了油后还是到不了下一站 输出 No Solution!
cout<<"No Solution!";
flag=false;
break;
}
}
}
if(flag==true) cout<<times<<endl;
}