A

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!”。

Sample

Input

7 7
1 2 3 4 5 1 6 6

Output

4

题解:

比较当前剩余油量能不能达到下一个加油站,能就不用停,不能就加满,然后再去下一个加油站。
注意,每到一个加油站,油箱的中的油都要减去这段距离的消耗,如果变为负数,则说明无法到达当前加油站。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
/**
*maxn当前数组最大值。
*/
int maxn = 1050;

int main()
{
    /**
    *n加油站的数量。
    *k油箱能跑的距离。
    */
    int k,n;
    /**
    *dis存储每个加油站到之前加油站的距离。
    *a当前油箱的剩余。
    *num停下加油的次数。
    */
    int i,dis[maxn],a,num;
    scanf("%d%d",&k,&n);
    //由于目的地也算一个点,所以实际输入为n+1个数据。
    for(i=0;i<=n;i++)
        scanf("%d",&dis[i]);
    a = k;
    num = 0;
    for(i=0;i<n;i++){
        a -= dis[i];
        if(a<0)
            break;
        if(a - dis[i + 1] < 0)
        {
            a = k;
            num++;
        }
    }
    //说明能够到达目的地。
    if(i==n)
        printf("%d
",num);
    //无法到达目的地。
    else
        printf("No Solution!
");
    return 0;
}
原文地址:https://www.cnblogs.com/luoxiaoyi/p/13848190.html