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\n",num);
    //无法到达目的地。
    else
        printf("No Solution!\n");
    return 0;
}
posted @   洛沐辰  阅读(520)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
历史上的今天:
2018-10-20 HDU-1114_Piggy-Bank
2018-10-20 HDU_1087-Super Jumping! Jumping! Jumping!
点击右上角即可分享
微信分享提示