贪心算法解决汽车加油问题
问题描述:一辆汽车加满油后可行驶n公里。旅途中有若干个加油站。设计一个有效算法,指出应
在哪些加油站停靠加油,使沿途加油次数最少。对于给定的n(n <= 5000)和k(k <= 1000)个加油站位置,编程计算最少加油次数。并证明算法能产生一个最优解
输入:第一行有2个正整数n和k,表示汽车加满油后可行驶n公里,且旅途中有k个加油站。接下来的1 行中,有k+1 个整数,表示第k个加油站与第k-1 个加油站之间的距离。第0 个加油站表示出发地,汽车已加满油。第k+1 个加油站表示目的地。
输出:输出编程计算出的最少加油次数
/*贪心算法解决汽车加油问题*/
/*
测试用例
①无法到达终点
1
1
10 20
②不用加油到达终点
100
1
10 20
③需要加油到达终点
10
6
1 4 5 3 6 8 3
*/
#include<stdio.h>
#define SIZE 1000
int main()
{
int flag = 1;//记录汽车是否可以到达终点
int n;
printf("请输入汽车加满油可以行驶的公里数:\n");
scanf("%d",&n);//汽车加满油可以行驶n公里
int k;
printf("请输入沿途加油站个数:\n");
scanf("%d",&k);//沿途有k个加油站
int sum=0;//记录加油次数
int a[SIZE];
int b[SIZE];//存放在第几号加油站加过油
int temp=0;//记录汽车行驶的距离
int t=0;
printf("请输入沿途加油站之间的距离:\n");
for(int i=1;i<=k+1;i++){
scanf("%d",&a[i]);//输入每个加油站距离下一个加油站的距离
if(a[i]>n){//如果某两个加油站之间的距离大于汽车油箱最大行驶距离
flag = 0;
printf("汽车不可到达目的地!");
break;
}
else{
temp+=a[i];
if(temp==n){
sum++;
temp=0;
b[t]=i;
t++;
}
if(temp>n){
sum++;
temp=a[i];//表示已经行驶了两个加油站之间的距离
b[t]=i-1;
t++;
}
}
}
if(sum > 0){
printf("最少加油次数为:%d\n",sum);
printf("分别在以下加油站加过油:\n");
for(int i=0; i<t; i++)
printf("第%d个%c",b[i], i==t-1?'\n':' ');
}
if(sum == 0 && flag == 1){
printf("汽车不用加油也可以到达终点\n");
}
return 0;
}