------------------------------------Sun----------------------------------------------
问题描述:
一辆汽车加满油后可行驶n公里。旅途中有若干个加油站。设计一个有效算法,指出应
在哪些加油站停靠加油,使沿途加油次数最少。对于给定的n(n <= 5000)和k(k <= 1000)个加油站位置,编程计算最少加油次数。并证明算法能产生一个最优解。
要求:
第一行有2个正整数n和k,表示汽车加满油后可行驶n公里,且旅途中有k个加油站。接下来的1 行中,有k+1 个整数,表示第k个加油站与第k-1 个加油站之间的距离。第0 个加油站表示出发地,汽车已加满油。第k+1 个加油站表示目的地。输出:输出编程计算出的最少加油次数。如果无法到达目的地,则输出”NoSolution”。
#include <stdio.h>
#include <string.h>
int greedy(int D[],int n,int k);
int n,k,D[100]; //D数组存储相邻加油站之间的距离
int main()
{
int i;
printf("请输入汽车满油行驶距离和加油站数:\n");
scanf("%d%d",&n,&k);
printf("请输入相邻加油站之间的距离:\n");
for(i = 1;i < k+1;i++)
{
scanf("%d\n",&D[i]);
}
printf("最少加油次数:%d\n",greedy(D,n,k));
return 0;
}
int greedy(int D[],int n,int k)
{
int i, s = D[0],sum = 0;
for(i = 0;i < k+1;i++) //对于k个加油站来说 若是距离>汽车最远行驶距离则不能到达目的地
{
if(D[i] >= n)
{
printf("no solution\n");
return 0;
}
}
for(i = 1;i < k+1;i++)
{
s += D[i]; //距离增加
if(s > n){ //知道大于汽车最远行驶距离
sum++; //加油次数+1
s = D[i]; //距离更新为到下一个加油站的距离
}
}
return sum; //返回加油次数
}