汽车加油问题
Description
一辆汽车加满油后可行驶n公里。旅途中有若干个加油站。设计一个有效算法,指出应在哪些加油站停靠加油,使沿途加油次数最少。并证明算法能产生一个最优解。
对于给定的n和k个加油站位置,计算最少加油次数。
Input
输入数据的第一行有2 个正整数n和k(n≤5000,k≤1000),表示汽车加满油后可行驶n公里,且旅途中有k个加油站。接下来的1 行中,有k+1 个整数,表示第k个加油站与第k-1 个加油站之间的距离。第0 个加油站表示出发地,汽车已加满油。第k+1 个加油站表示目的地。
Output
将计算出的最少加油次数输出。如果无法到达目的地,则输出“No Solution!”。
Samples
Sample #1
Input
7 7
1 2 3 4 5 1 6 6
Output
4
分析:
贪心算法
解题思路:
(1)用一维数组存放(k+1)个距离;设置变量sum用于记录汽车d当前还能行驶多大的距离。
(2)如果汽车当前可行驶的距离小于该站与下一站间的距离,就先加满油,若加满油后汽车仍然不能到达下一站,那该问题就无解,输出“No Solution!";否则,加油次数加一,继续行驶;之后汽车到达下一站,更新sum的值为(sum - a[i])。
(3)继续执行上述过程,直到汽车到达终点站或问题无解。
#include<iostream>
#include <climits>
#include<vector>
using namespace std;
int a[1010];
int n,m,k=0,c=0;int main(){cin>>n>>k; int t=0;//加油次数 for(int i=0;i<k+1;i++)cin>>a[i];//这个加油站到下个加油站的距离int sum=n;//还能行驶的距离 for(int i=0;i<k+1;i++){if(sum<a[i]){//不能到下一个加油站了 sum=n;//加满油 t++;if(sum<a[i]){//加满之后还不能到达 cout<<"No Solution!"<<endl;return 0;}}sum-=a[i];//行驶 }cout<<t<<endl;return 0;
}