• 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;
    }
    
  • 相关阅读:
    1061. 判断题(15)
    1070. 结绳(25)
    1069. 微博转发抽奖(20)
    1068. 万绿丛中一点红(20)
    1067. 试密码(20)
    DB2sql关键字——ALTER TABLE ....ACTIVATE NOT LOGGED INITIALLY WITH EMPTY TABLE
    DB2系统内置——SYSCAT.TABLES 所有的字段说明
    DB2系统内置——db2日期和时间常用汇总
    Linux——下查找某个文件位置的方法
    Linux下清除tomcat缓存
  • 原文地址:https://www.cnblogs.com/luoxiaoyi/p/13848190.html
Copyright © 2020-2023  润新知