汽车加油问题【贪心算法】

2023-11-13

1. 原版

  • Problem 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

Sample Output

4

解题思路:
(1)用一维数组存放(k+1)个距离;设置标志位,用于判断问题是否有解;设置变量d用于记录汽车在当前站出发还能行驶多大的距离。
(2)如果汽车当前的d大于该站与下一站间的距离,那么汽车可以到达下一站,到达后更新d的值为(d - a[i])。继续行驶,若当前的d小于该站与下一站间的距离,就先加满油,若加满油后汽车还是到达不了下一站,那该问题就无解;否则,加油次数加一,汽车到达下一站,更新d的值为(d - a[i])。
(3)继续执行上述过程,直到汽车到达终点站或问题无解。

  • 代码实现
#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n,k;   //定义汽车加满油后可行驶距离和k个加油站
    int a[1002];   //a[k]表示第k个加油站与第k-1 个加油站之间的距离
    int count=0;   //记录加油次数
    int d;   //汽车此时还能行驶的距离
    int flag=1;
    cin>>n>>k;
    for(int i=1;i<=k+1;i++)
        cin>>a[i];
    d=n;   //刚开始汽车可以行驶n公里
    for(int i=1;i<=k+1;i++)
    {
        if(d>=a[i])   //如果汽车当前还能行驶的距离大于等于该站到下一站的距离,汽车就可以到达下一个加油站
            d-=a[i];   //到达下一个加油站后,汽车还能行驶的距离d要减去刚才的两个加油站间的距离
        else
        {
            d=n;   //如果条件不成立,就先给汽车加满油,再看能否到达下一个加油站
            if(d<a[i])   //如果满油还不能到达下一个加油站,此问题就无解了
                flag=0;
            count++;   //加满油能到达,就将加油次数加一
            d-=a[i];   //并且汽车还能行驶的距离d要减去刚才的两个加油站间的距离
        }

    }
    if(!flag)
        cout<<"No Solution!"<<endl;
    else
        cout<<count<<endl;
    return 0;
}
  • 运行结果
    在这里插入图片描述

2. 加强版

  • Problem Description
    在上面问题的基础上,输出需要加油的站的序号。

解题思路:
设置一个标志位b[i]:b[i]=0表示不需要加油,b[i]=1表示需要加油。

  • 代码实现
#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n,k,a[1001],d,count=0,b[1001];
    bool flag=true;
    cin>>n>>k;
    d=n;
    for(int i=1;i<=k+1;i++)
        cin>>a[i];
    for(int i=1;i<=k+1;i++)
    {
        if(d>=a[i])   //大于等于:能到达下一个加油站
            d-=a[i];
        else
        {
            d=n;
            if(d<a[i])
                flag=false;
            count++;
            b[i-1]=1;
            d-=a[i];
        }
    }
    if(!flag)
        cout<<"No Solution!"<<endl;
    else
    {
        for(int i=1;i<=k+1;i++)
        {
            if(b[i]==1)
                cout<<"第"<<i<<"站需要加油!"<<endl;
        }
        cout<<count<<endl;
    }
    return 0;
}
  • 运行结果
    在这里插入图片描述
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

汽车加油问题【贪心算法】 的相关文章

  • Huffman-哈夫曼编码算法详解

    1 概述 背景 哈夫曼编码是广泛地用于数据文件压缩的十分有效的编码方法 其压缩率通常在20 90 之间 哈夫曼编码算法用字符在文件中出现的频率表来建立一 个用0 1串表示各字符的最优表示方式 给出现频率高的字符较短的编码 出现频率较低的字符
  • 贪心算法初步

    一 什么是贪心算法 贪心算法的定义 贪心算法是指在对问题求解时 总是做出在当前看来是最好的选择 也就是说 不从整体最优上加以考虑 只做出在某种意义上的局部最优解 贪心算法不是对所有问题都能得到整体最优解 关键在于贪心策略的选择 选择的贪心策
  • 力扣 455. 分发饼干

    class Solution public int findContentChildren int g int s Arrays sort g 对 g 数组排序 Arrays sort s int count 0 统计孩子满足的个数 int
  • 代码随想录 - Day37 - 贪心算法

    代码随想录 Day37 贪心算法 376 摆动序列 排除只有一个数的情况 把差值全部求出来放到dif里 在此过程中顺便去掉差值为0的情况 如果dif为空 说明里面所有差值为0 那么最长摆动序列只能是1 直接返回 如果dif不为空 把dif
  • 交换字符使得字符串相同--贪心算法

    LeetCode 交换字符使得字符串相同 有两个长度相同的字符串 s1 和 s2 且它们其中 只含有 字符 x 和 y 你需要通过 交换字符 的方式使这两个字符串相同 每次 交换字符 的时候 你都可以在两个字符串中各选一个字符进行交换 交换
  • 马踏棋盘-数据结构 详细教程

    文章目录 一 问题描述 二 问题分析 三 深度优先搜索 Depth First Search 1 基本原理 2 代码预览 四 dfs 贪心算法 1 贪心策略 2 贪心原理 3 核心代码 4 代码预览 五 栈 贪心 1 回溯方法 2 基本操作
  • 骑士周游问题

    骑士周游问题 1 马踏棋盘问题 骑士周游问题 实际上是图的深度优先搜索 DFS 的应用 2 如果使用回溯 就是深度优先搜索 来解决 假如马儿踏了53个点 如图 走到了第53个 坐标 1 0 发现已经走到尽头 没办法 那就只能回退了 查看其他
  • 斗罗大陆解算法—魂环的最佳获取法

    前言 作者主页 雪碧有白泡泡 个人网站 雪碧的个人网站 推荐专栏 java一站式服务 前端炫酷代码分享 uniapp 从构建到提升 从0到英雄 vue成神之路 解决算法 一个专栏就够了 架构咱们从0说 数据流通的精妙之道 文章目录 前言 背
  • 数据结构三大算法(案例解析)

    概述 本文讲述数据结构中最常用到的三大算法 分治法 动态规划法和贪心算法 主要从这些算法的经典案例入手来对算法进行分析和理解 分治法 分治法可以通俗的理解为将一条大鱼分成好几块 分别料理每一块鱼肉 然后再组成一道菜 也就是说分治法是将一个大
  • 力扣45.跳跃游戏II 动态规划与贪心两种解法

    问题 给定一个长度为 n 的 0 索引整数数组 nums 初始位置为 nums 0 每个元素 nums i 表示从索引 i 向前跳转的最大长度 换句话说 如果你在 nums i 处 你可以跳转到任意 nums i j 处 0 lt j lt
  • 华为机试C语言-书籍叠放问题2

    题目描述 https www cnblogs com zucc 31701019 p 14967899 html https zhuanlan zhihu com p 526649048 这题贪心就可以了 强行动态规划有点勉强 但是也刚好练
  • 骑士周游问题

    算法 1 骑士周游问题 马踏棋盘算法也被称为骑士周游问题 将马随机放在国际象棋的 8x8 棋盘中 0 7 0 7 的某个方格中 马鞍走起规则 马走日字 进行移动 要求每个方格只进入一次 走遍棋盘上全部64个方格 3 会使用到图的遍历算法 D
  • AcWing 1055. 股票买卖 II

    输入样例1 6 7 1 5 3 6 4 输出样例1 7 输入样例2 5 1 2 3 4 5 输出样例2 4 输入样例3 5 7 6 4 3 1 输出样例3 0 样例解释 样例1 在第 2 天 股票价格 1 的时候买入 在第 3 天 股票价格
  • Acwing-4655. 重新排序

    我们可以累计每个 A i 的被求和次数 c i 容易贪心得到 被求和次数越多的肯定得放越大的数 我们可以先统计原来的求和的总和 sum 再给 A 数组和统计求和次数的数组 c 从小到大排好序 最后依次相乘起来即 i 1 n a i c i
  • 动态规划算法(2)最长回文子串详解

    文章目录 最长回文字串 动态规划 代码示例 前篇 1 初识动态规划 最长回文字串 传送门 https leetcode cn problems longest palindromic substring description 给你一个字符
  • 华为OD机试真题-最大利润【C++ Java Python】

    文章目录 目录 题目内容 解题思路 Java代码 Python代码 C 代码 题目内容 商人经营一家店铺 有number 种商品 由于仓库限制每件商品的最大持有数量是 item index 每种商品的价格是 price item index
  • Python实现找零兑换的三种解法

    找零兑换 找零兑换问题最直接的解法就是贪心策略 比如问题 有面值1 5 10 25的硬币 求解兑换63元所需的最少硬币数 贪心策略的思想就是不断的利用面值最大的硬币去尝试 不行了 在尝试较小面值的硬币 该例中也即使用25的硬币去尝试 2枚2
  • 37: 合并区间

    题目 以数组 intervals 表示若干个区间的集合 其中单个区间为 intervals i starti endi 请你合并所有重叠的区间 并返回 一个不重叠的区间数组 该数组需恰好覆盖输入中的所有区间 思路 这道题我的思路完全正确 先
  • P1719 Let‘s play a game!

    include
  • 【贪心算法】【中位贪心】LeetCode:100123.执行操作使频率分数最大

    涉及知识点 双指针 C 算法 前缀和 前缀乘积 前缀异或的原理 源码及测试用例 包括课程视频 贪心算法 题目 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 你可以对数组执行 至多 k 次操作 从数组中选择一个下标 i 将 n

随机推荐

  • 成功实施MES系统的11条建议,收藏备用

    信息化成为社会和企业发展的主流趋势 加上生产力的普遍提高 在这种情势下 MES系统为制造业带来新的生命活力 可以通过信息化方式 实现对整个生产环节智能化 精益化管理 但这一切的前提在于要成功实施MES系统 那么企业如何成功实施MES系统呢
  • 防抖处理(后端处理)

    什么是防抖 在一定时间间隔内函数被触发多次 但只执行最后一次 PS 虽然实际场景中都是前端在处理 但是后端也是需要进行处理的 解决方案思路 通过SpringMvc对请求进行拦截 然后进行重复校验 具体步骤看下面 1 配置自定义的拦截器 防止
  • 异步电机电压型磁链观测器改进-LPF串联HPF+基于时间向量分析的稳态补偿的改进策略

    导读 针对低通滤波环节替换电压模型纯积分环节加反馈补偿的改进方法 磁链估计仍然存在幅值和相位误差 的问题 本期文章介绍采用LPF串联HPF替换纯积分环节 然后基于时间向量分析的稳态补偿策略来对电压模型进行改进 仿真结果表明 新介绍的改进方法
  • 重磅!《深度学习 500 问》已更新,(附完整下载)

    近年来 深度学习技术在计算机视觉 cv 自然语言处理 NLP 等领域都取得了非常不错的成果 自然而然地成为技术人员争相学习的热点 为了帮助正在学习深度学习的伙伴们 川大的一名优秀毕业生 在GitHub上创建了一个项目 深度学习500问 通过
  • C/C++ 递归函数(数组倒序)

    题目描述 输入多个整数 以0结束 将这些整数逆序后输出 要求 使用递归函数将数组倒序 在main中调用递归函数 输入 多个整数 最后为0 输出 逆序后的这些整数 样例输入 1 2 5 4 0 1 2 3 4 5 6 7 8 9 0 样例输出
  • 强大的QDataStream

    书上是这样描述QDataStream的 QDataStream提供了一种与运行平台无关的存储格式 他不仅支持QList
  • JS 之 事件Event对象详解(属性、方法、自定义事件)

    一 Event对象 1 简介 事件event对象是指在浏览器中触发事件时 浏览器会自动创建一个event对象 其中存储了本次事件相关的信息 包括事件类型 事件目标 触发元素等等 浏览器创建完event对象之后 会自动将该对象作为参数传递给绑
  • 详解C语言中的数组指针与指针数组

    详解数组指针与指针数组 数组指针 一 区分 首先我们需要了解什么是数组指针以及什么是指针数组 如下图 int p 5 int p 5 数组指针的意思即为通过指针引用数组 p先和 结合 说明了p是一个指针变量 指向一个大小为5的数组 所以 i
  • MSER+NMS 文本检测(身份证+发票+火车票)

    此篇文章不细说MSER和NMS原理 以实战为主 MSER是最大稳定极值区域 是对一幅灰度图像 灰度值为0 255 取阈值进行二值化处理 阈值从0到255依次递增 阈值的递增类似于分水岭算法中的水面的上升 随着水面的上升 有一些较矮的丘陵会被
  • axure文本框单击提示文字消失_Axure基础原件使用

    本内容从网上搜索 仅供参考学习 1 添加元件到工作区 在左侧元件中选择要使用的元件 按住鼠标左键不放 拖到画布适合的位置上松开 2 添加元件名称 在检视面板的元件名称文本框中输入元件自定义名称 3 设置元件位置 尺寸 元件的位置和尺寸可以通
  • GNU GRUB version 2.06 Minimal Bash-lke line editing is supported 问题修复

    一 问题背景 博主喜欢折腾系统 电脑原来有一个windows系统 想整一个Linux双系统 结果开机时出现以下画面 GNU GRUB version 2 06 Minimal Bash lke line editing is support
  • freessl 免费https证书申请

    1 https freessl cn 2 输入域名和邮箱 3 选 文件验证 和 浏览器生成 如图 image png 按照该网页要求的指定位置 将两个验证文件ftp到你的网站服务器 能用http访问到这两个文件即可 4 下载文件 image
  • Spring aop报错:com.sun.proxy.$Proxyxxx cannot be cast to yyy

    在使用Spring AOP时 遇到如下的错误 Exception in thread main java lang ClassCastException com sun proxy Proxy0 cannot be cast to com
  • Linux内核学习:I2C_SLAVE_FORCE

    在Linux内核源代码include linux i2c dev h文件内 有如下定义 define I2C SLAVE 0x0703 Use this slave address define I2C SLAVE FORCE 0x0706
  • 立体电影

    立体电影 百科名片 1953年5月24日立体电影首次出现 为了把观众从电视夺回来 好莱坞推出了一种新玩艺儿 立体电影 戴着特殊眼镜的观众像在观看 布瓦那魔鬼 及 蜡屋 这类惊险片那样 发现自己躲在逃跑的火车及魔鬼的后面 从而为我们带入了立体
  • weex-26-dom模块

    D0BE7A90 F94A 4C9A 98D6 1EE3D44C1E5E png 本节学习目标 dom 滚动到指定组件 dom 获取组件的布局信息 我们经常会看到上图所示的需求 当我们将列表向下滑动一段时间后 想要立刻回到顶部 这个时候就要
  • qt中bug总结:遇到C1071:在注释中遇到意外的文件结束

    qt中编译时突然出现这个问题 然后就是编译不过去 百度了好多之后 最后就是在报错的cpp文件中进行查找 找到这个 的注释格式 发现问题就是它导致的 去掉这种注释之后 则发现没问题了
  • 第十三届蓝桥杯省赛JavaA组-试题D-GCD

    题目 代码 import java util Scanner public class lqb13 A组04GCD public static void main String args 希望gcd a k b k 尽可能的大 而k尽可能的
  • 那些从黑马毕业的学生,都去哪工作了?

    我们对这个世界的认知 常常受到身边人的影响 你是否听到过这样的话 房子越来越买不起了 结婚彩礼真的是越来越贵了 找一份不错的工作真是越来越难了 这些看法 让你对生活 对工作产生畏惧 但是 你身边一定也有这样的人 30出头已经买房买车了 刚毕
  • 汽车加油问题【贪心算法】

    1 原版 Problem Description 一辆汽车加满油后可行驶n公里 旅途中有若干个加油站 设计一个有效算法 指出应在哪些加油站停靠加油 使沿途加油次数最少 并证明算法能产生一个最优解 对于给定的n和k个加油站位置 计算最少加油次