描述
一辆汽车加满油后可行驶n公里。旅途中有若干个加油站。设计一个有效算法,指出应在哪些加油站停靠加油,使沿途加油次数最少。 对于给定的n和k(k <= 1000)个加油站位置,编程计算最少加油次数。
Input
有多个测试用例。每个测试用例输入数据的第一行有2 个正整数n和k,表示汽车加满油后可行驶n公里,且旅途中有k个加油站。接下来的1 行中,有k+1 个整数,表示第k个加油 站与第k-1 个加油站之间的距离。第0 个加油站表示出发地,汽车已加满油。第k+1 个加油站表示目的地。当输入n,k都是0的时候表示测试结束。
Output
将编程计算出的最少加油次数输出,每个测试用例输出一行。如果无法到达目的地,则输出"No Solution"。
Sample Input
7 7 1 2 3 4 5 1 6 6 5 1 50 5 0 0
Sample Output
4 No Solution
----------------------------------------------------------------------------------------
#include<stdio.h>
int a[1001];
int count=0;
void Count(int max_l,int n)
{
int i,j,flag=0;
for(i=0;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]>max_l) //判断加油站间距离超过满油走的一趟路程长度
flag=1;
}
if(flag==1)
{
printf("No Solution\n");
}
else
{
int max=0; //尽力走得最远
for(j=0;j<=n;j++)
{
max+=a[j];
if(max>max_l)
{
j--; //退回去加油
max=0;
count++;
}
}
printf("%d\n",count);
}
}
main()
{
int n,max_l;
scanf("%d%d",&max_l,&n);
while(n&&max_l)
{
Count(max_l,n);
scanf("%d%d",&max_l,&n);
}
}
贪心算法解决方案
贪心算法的基本思想:该题目求加油的最少次数,就是说求最优解的问题,可分成几个步骤,每个步骤的最优解不一定是整个问题的最优解,
然而对于有些问题,局部的最优解可以得到全局的最优解。贪心算法就是将问题的求解过程看作是一系列选择,从问题的初始解出发,向定点目标推进,
推进的每一个阶段不是依据一个固定的递推过程,而是每一个阶段看上去的最优解。
问题的分析:由于汽车由起始点到终点方向开,我们可以假设,通过一趟加油,使其能够最大限度地完成这趟油的使命,那么每加满一次油,都能够最大限度地利用这一趟油,那么我们所走过的路程就越长,离终点就越接近,那么自然加油的次数就最少了。