汽车加油问题

汽车加油问题

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
#include 
#include
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;
} 

你可能感兴趣的:(题解,算法,c++)