To Fill or Not to Fill(贪心算法)

2023-05-16

题目描述
有了高速公路,开车从杭州到任何其他城市都很容易。但由于汽车的油箱容量有限,我们必须不时地在路上找到加油站。不同的加油站可能会给出不同的价格。你被要求仔细设计最便宜的路线去。

输入描述:
对于每个测试实例

第一行包含4个正数:Cmax(<=100),即油箱的最大容量;D(<=30000),即杭州到目的地城市的距离;Davg(<=20),即汽车每单位汽油可行驶的平均距离;N(<=500),即加油站总数。

接下来是N行,每行包含一对非负数:Pi,煤气单价,Di(<=D),这个站到杭州的距离,i=1,…N。一行中的所有数字用空格隔开。

输出描述:
对于每个测试用例,一行打印最便宜的价格,精确到小数点后2位。假设开始时油箱是空的。如果无法到达目的地,请打印“最大行驶距离=X”,其中X是车辆可以行驶的最大可能距离,精确到小数点后2位。

输入

50 1300 12 8
6.00 1250
7.00 600
7.00 150
7.10 0
7.20 200
7.50 400
7.30 1000
6.85 300 50 1300 12 2
7.10 0
7.00 600

输出

749.17


贪心算法难就难在思路

  1. 算法一,常规的想法是从距离0开始一点一点的考虑每一步应当用什么价格的汽油,从而走完全程。这是可以的:
    1. 维护一个优先队列,表明现在可以用的汽油价格,每一步只需用最低价格即可,如果没有就不可行进。
    2. 在加油站的区间两端添加或去除可用汽油价格。
    3. 然而这样的做法比较麻烦。
  2. 算法二,如果我们换一个角度,希望用低价油,那么可以从汽油的角度。
    1. 用低价油走能走的部分,剩余部分则依次往高价油尝试,直至所有价格的油都被尝试过。
    2. 到最后如果有区间被遗漏就不能走完,否则就可以走完。
    3. 这样的思路就更显简洁,以下实现算法二。

#include <iomanip>
#include <iostream>
#include <numeric>
#include <vector>
#include <utility>
#include <algorithm>
using namespace std;

using gas_info = pair<double, int>;

const int MAX = 30000;
double tag[MAX];

bool compare(const gas_info & x, const gas_info & y){
    return x.first < y.first;
}

int main() {
    int Cmax, D, Davg, N;
    while (cin >> Cmax >> D >> Davg >> N) {
        double p;
        int d;
        vector<gas_info> gas;
        for(int i = 0; i < N; i++){
            cin >> p >> d;
            gas.emplace_back(p, d);
        }
        sort(gas.begin(), gas.end(), compare);
        fill_n(tag, D, 0);

        double cost = 0;
        for(auto g : gas){
            int distance = min(Cmax * Davg, D - g.second) + g.second; // 最远可走到距离
            for(int i = g.second; i < distance; i++){
                // 如果未被走过则走,置为1
                // 否则一定被走过,但是后面可能有未走过的路,还要接着走
                if(tag[i] == 0){
                    tag[i] = 1;
                    cost = cost + g.first / Davg;
                }
            }
        }

        if(accumulate(tag, tag + D, 0) == D) {
            cout << fixed << setprecision(2) << cost << endl;
        }else {
            for (int i = 0; i < D; i++) {
                if (tag[i] == 0) {
                    cout << "The maximum travel distance = " << fixed << setprecision(2) << i * 1.0 << endl;
                    break;
                }
            }
        }
    }

    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

To Fill or Not to Fill(贪心算法) 的相关文章

  • 贪心算法之背包问题

    贪心算法之背包问题 背包问题是算法的经典问题 分为部分背包和0 1背包 主要区别如下 部分背包 某件物品是一堆 可以带走其一部分 0 1背包 对于某件物品 要么被带走 选择了它 要么不被带走 没有选择它 不存在只带走一部分的情况 部分背包问
  • 1827. 最少操作使数组递增 ----- 贪心算法

    给你一个整数数组 nums 下标从 0 开始 每一次操作中 你可以选择数组中一个元素 并将它增加 1 比方说 如果 nums 1 2 3 你可以选择增加 nums 1 得到 nums 1 3 3 请你返回使 nums 严格递增 的 最少 操
  • 动态规划:什么是动态规划?

    一 什么是动态规划 动态规划 Dynamic Programming 简称Dp 是一种算法思想 将原 大 问题化解成子问题 再根据子问题的解得出原问题的解 1 1 什么是最优子结构和重复子问题 1 2 什么是状态转移方程 跟最优子结构的关系
  • 剑指 Offer :001整数除法

    题目描述 给定两个整数 a 和 b 求它们的除法的商 a b 要求不得使用乘号 除号 以及求余符号 注意 整数除法的结果应当截去 truncate 其小数部分 例如 truncate 8 345 8 以及 truncate 2 7335 2
  • 2020算法设计与分析 官方考前模拟卷 参考答案

    算法设计与分析 样例试题 算法设计与分析总结笔记 注 此试题仅供了解题型 和期末考试试题没有任何直接关系 FBI Warning 这套题难度较大 千万不要坏了心态 xj大佬说要是考试那么难他直播粪坑蝶泳 Power By 王宏志教授 5 分
  • Acwing 906. 区间分组

    1 将所有区间按照左端点从小到大排序 2 从前往后处理每个区间 判断能否将其放到某个现有的组中 L i gt Max r 1 如果不存在这样的组 则开新组 然后将其放进去 2 如果存在这样的组 将其放进去 并更新当前组的Max r incl
  • 雪糕的最大数量 排序+贪心

    雪糕的最大数量 雪糕的最大数量 题目描述 样例 数据范围 思路 代码 题目描述 夏日炎炎 小男孩 Tony 想买一些雪糕消消暑 商店中新到 n 支雪糕 用长度为 n 的数组 costs 表示雪糕的定价 其中 costs i 表示第 i 支雪
  • 使用 fill 或 fill_ Between 绘制甜甜圈

    我想绘制一个甜甜圈 我的脚本是 import numpy as np import matplotlib pyplot as plt pi sin cos np pi np sin np cos r1 1 r2 2 theta np lin
  • UIImage 用另一张图像填充透明部分

    我想在 iOS 中用另一张图像填充图像的透明部分 我尝试过一些东西UIGraphicsContext 但我无法让它工作 因为我以前从未使用过它 这是图像 我尝试过的一些代码 UIImageView v UIImageView alloc i
  • 根据序列前后的值替换 NaN 序列

    如果有人能帮助我解决这个问题 我将不胜感激 我有一个向量 A NaN 1 1 1 1 NaN NaN NaN NaN NaN 2 2 2 NaN NaN NaN 2 NaN NaN 3 NaN NaN 我想根据这个逻辑填充 NaN 值 1
  • 基于 pandas 数据框 python 同一列中的先前值的条件替换

    感觉我几乎到处都看过了 我知道这可能是非常简单的事情 我正在使用 pandas 数据框 并希望根据同一列中的数据填充 替换其中一列中的数据 我通常更喜欢使用 Excel 而且 Excel 非常简单 如果我们有 df pd DataFrame
  • 用ggplot填充R中两条黄土平滑线之间的区域

    我想知道如何填充 ggplot 中黄土平滑线之间的区域 以下数据框用于图片 x y ymin ymax grp ydiff 1 1 3 285614 3 285614 10 14177 min 6 8561586 2 1 10 141773
  • 如何根据 2 列中的值给出的日期范围删除行?

    我有一个包含一系列日期的数据集 需要在新行中填写缺失的日期 df1是我正在使用的数据的示例df2是我设法实现的目标 我陷入困境的地方 的一个例子 df3这就是我想要结束的地方 df1 ID Date DateStart DateEnd 1
  • fill_ Between() 不起作用

    I have this tiny problem with a chart I am working on I d like to fill the area between 2 semi vertical lines as shown b
  • Javascript - 使用 iframe-in 值填充输入

    我想用我的 iframe in 值填充输入 我有两个html文件 1 html 和 2 html第一个 1 html 是这样的
  • setProgressDrawable 填充整个seekBar

    正如我在标题中所说 当我使用 setProgressDrawable 时 它 会填充整个 SeekBar 如果进度为 34 则进度显示 100 但拇指显示正确的百分比为 34 我不明白可能是什么问题 done setProgressDraw
  • 使用scale_fill_binned()时如何使用特定的填充颜色?

    我想使用我自己的填充颜色 例如 c red blue grey50 black 使用函数时scale fill binned 在 ggplot 代码中 我怎样才能做到这一点 这是一个最小的可重现示例 library tidyverse da
  • pandas:在(多索引)DataFrame上使用每个组中最常见的值执行 fillna() 的最佳方法是什么?

    有一个包含一些 NaN 值的 DataFrame df pd DataFrame A 1 1 1 1 2 2 2 2 B 1 1 np NaN 2 3 np NaN 3 4 A B 0 1 1 0 1 1 1 0 2 1 NaN lt 3
  • 在 MATLAB 中填充两个连接组件之间的区域

    我有一个在 MATLAB 中表示数字的二值图像 我想填写所有数字 期望的结果是 我唯一发现的是imfill函数 但这并没有多大帮助 因为我丢失了内部数据 例如 9 的内圈 另一种可能性是使用BW边界 http www mathworks c
  • 如何填充剩余高度的100%?

    1 2

随机推荐

  • 轮询、中断和DMA三种方式的原理和联系

    CPU控制外部设备的方式 xff1a 中断 轮询 DMA 轮询中断DMA 由于外部设备的速度差异 xff0c CPU可以使用不同的方式控制外部设备的访问 常见的方式轮询 中断和DMA 轮询 轮询最简单 xff0c CPU通过不断地查询某个外
  • OpenMV识别色块与STM2F4通过串口通信

    花了三天时间学习了一下OpenMV的简单使用 xff0c 在这写个博客记录一下 xff0c 并且上传自己的代码 xff0c 以方便交流学习 第一次发帖 xff0c 不周之处见谅 首先概括一下我实现的功能 xff1a OpenMV识别红色色块
  • c++语言简单提问

    1 定义一个空的类型 xff0c 里面没有任何成员变量和成员函数 对该类型求sizeof xff0c 得到的结果是 1 2 为什么不是0 空类型的实例中不包含任何信息 xff0c 本来求sizeof应该是0 xff0c 但是当我们声名该类型
  • 二 ROS通信机制-话题通信(发布订阅模式)

    二 ROS通信机制 话题通信 发布订阅模式 ROS 中的基本通信机制2 1话题通信 发布订阅模式 2 1 1概念2 1 2作用2 1 3 理论模型2 1 4 话题通信应用时需要关注的地方 xff1a 3 简单实现3 1ROS工作空间建立 x
  • 解决ROS中运行launch文件报错ERROR: cannot launch node of type[xxx/xxx]:xxx的问题

    解决ROS中运行launch文件报错ERROR cannot launch node of type xxx xxx xxx的问题 错误截图 xff1a 原因 xff1a 解决方式 xff1a 当时我出现的错误是 ERROR cannot
  • c++ stl 五种迭代器

    c 43 43 stl 五种迭代器 2010 12 31 14 22 25 分类 xff1a C 43 43 C 举报 字号 订阅 下载LOFTER 我的照片书 迭代器的分类 Iterator Categories I
  • C语言头文件中定义变量问题(转)

    上个星期回学校的时候 xff0c 刚好碰到一个学弟在写程序 xff0c 并且刚好碰到一个总编不过去的问题 xff0c 我看了看 xff0c 正好是个头文件重复包含问题 xff0c 问题描述如下 xff1a 他在程序中建立了一个global
  • Opencv Aruco识别(python)

    效果图 先上效果 代码 直接上代码 xff1a span class token operator span span class token operator span usr span class token operator span
  • Windows下Cmake安装步骤详解(图文)

    文章目录 Cmake介绍Cmake下载及安装 Cmake介绍 CMake是一个跨平台的安装 xff08 编译 xff09 工具 xff0c 可以用简单的语句来描述所有平台的安装 编译过程 xff0c 并且输出对应的makefile或者pro
  • C语言:通过指针模拟实现strcat函数

    模拟实现strcat strcat函数的功能 把src所指向的字符串 xff08 包括 0 xff09 复制到dest所指向的字符串后面 xff08 删除dest原来末尾的 0 xff09 要保证dest足够长 xff0c 以容纳被复制进来
  • C语言中将字符串拆分再进行拼接

    我们有时候需要对于字符串进行操作 xff0c 主要用到strcat和strtok两个函数 xff0c 因此记录下这次的操作方式以便之后查阅 span class token macro property span class token d
  • 并行编程实现矩阵乘法优化

    实现四种矩阵乘法程序 xff0c 并对比运行效率 1 xff09 串行算法 2 xff09 Catch优化 3 xff09 SSE版本 4 xff09 分片策略 span class token macro property span cl
  • c++的函数reserve()和unique()和sort()

    函数reserve span class token comment vector reserve span span class token macro property span class token directive keywor
  • 关于c中代码加 ‘\‘ 进行换行的说明

    我们在c与c 43 43 中经常会遇到一种情况就是加 进行换行来保持代码整体结构一致的使用情况 xff0c 那么具体来说换行的规则是什么 xff0c 这里进行一下记录 span class token macro property span
  • git的命令总结

    先把清单列出来git cheat sheet git 命令总结 git的init和git clonegit add和git commit 提交二连git checkout 反向操作git reset 回退HEAD指针git revert 同
  • 宏定义中的可变参数 __VA_ARGS__ 用法 与 #和##的用法

    首先了解一下可变参数 span class token macro property span class token directive keyword include span span class token string lt st
  • C++结构体简单链表原理解释

    对结构体简单链表原理的简单解释 xff0c 程序如下 xff1a struct lianbiao int no string name struct lianbiao next lianbiao head 61 nullptr tail 6
  • linux小连招

    Linux命令目录 查看当前shell的种类find命令查找文件 查看当前shell的种类 查看当前发行版可以使用的shell xff1a chao 64 chao span class token function cat span et
  • 侵略性奶牛(对于二分的总结)

    题目 Farmer John has built a new long barn with N 2 lt 61 N lt 61 100 000 stalls The stalls are located along a straight l
  • To Fill or Not to Fill(贪心算法)

    题目描述 有了高速公路 xff0c 开车从杭州到任何其他城市都很容易 但由于汽车的油箱容量有限 xff0c 我们必须不时地在路上找到加油站 不同的加油站可能会给出不同的价格 你被要求仔细设计最便宜的路线去 输入描述 对于每个测试实例 第一行