描述
一辆汽车加满油后可行驶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);
}
}
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);
}
}
贪心算法解决方案
贪心算法的基本思想:该题目求加油的最少次数,就是说求最优解的问题,可分成几个步骤,每个步骤的最优解不一定是整个问题的最优解,
然而对于有些问题,局部的最优解可以得到全局的最优解。贪心算法就是将问题的求解过程看作是一系列选择,从问题的初始解出发,向定点目标推进,
推进的每一个阶段不是依据一个固定的递推过程,而是每一个阶段看上去的最优解。
问题的分析:由于汽车由起始点到终点方向开,我们可以假设,通过一趟加油,使其能够最大限度地完成这趟油的使命,那么每加满一次油,都能够最大限度地利用这一趟油,那么我们所走过的路程就越长,离终点就越接近,那么自然加油的次数就最少了。