P1016 旅行家的预算【模拟+贪心】【详解】

2023-10-29

题目链接

思路

  这道题是一道很明显的模拟题,但这道题也需要自己的理解,我自己写了些样例,然后找到了其中的模拟,我们假设从一个点出发,对于它的下一个点我们有很多选择,期间定义一个len用以记录满油(单次最远)到达距离,我们造访这条路上的所有点,如果存在“<=”目前节点油价的点,就走开到那个点,那么我们要加多少油?于是,我定义了now_oil记录到达目标点后剩余油量,每次询问该点往后的所有点,找到第一个("<=")即退出循环,然后抵达该点,now_oil就“=0”了,然而,假如这条路径上没有比它便宜的店了,那么这次就直接加满c,然后,访问下一个节点,看看从它出发是否存在更加便宜的店,找到便宜的,然后就抵达它,期间会需要耗油,但是与前面“<=”的情况会有不同,你会发现,这是有油时候达到的情况,那如何处理?我们可以还是抵达该点,然后处理:从目前点到该点需要need_oil的量的油,如果原本now_oil的油还够花,就说明到达该点的钱还是会贵些,但却是其他中最便宜的了,我们不增加花费的钱,我们减去目前剩的油即可,但是若是need_oil>now_oil,就说明得花点钱了,具体花多少,得看need_oil - now_oil的值了。

  细节

本题并没有说明加油站是按顺序排列的,需要注意!!!

无法抵达终点:两两路径中,存在某一路径长大于满油时的最远行驶路径。

 

完整代码:

//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
using namespace std;
typedef long long ll;
const int maxN=10;
double d1,c,d2,p;
int N;
struct node
{
    double pos,cost;        //距离初始点距离、该油站花费价格
    node(double a=0, double b=0):pos(a),cost(b) {}
}oil[maxN];
bool cmp(node e1, node e2)      //距离原点最近的在前
{
    return e1.pos<e2.pos;
}
int main()
{
    while(scanf("%lf%lf%lf%lf%d",&d1,&c,&d2,&p,&N)!=EOF)
    {
        double cost=0, len=c*d2, now_oil=0,det_l=0;     //总计花费、满油到达距离,目前石油量
        memset(oil, 0, sizeof(oil));
        N+=2;
        oil[1]=node(0, p);      oil[N]=node(d1, 0);
        for(int i=2; i<N; i++) scanf("%lf%lf",&oil[i].pos,&oil[i].cost);
        sort(oil+1, oil+1+N, cmp);
        for(int i=2; i<=N; i++) det_l=max(det_l, oil[i].pos-oil[i-1].pos);
        if(len<det_l)       //无法抵达终点
        {
            printf("No Solution\n");
            continue;
        }
        int k=1;
        while(k<=N)
        {
            int i;
            for(i=k+1; i<=N && oil[k].pos+len>=oil[i].pos; i++)
            {
                if(oil[i].cost<=oil[k].cost)        //找到比这个站台便宜的下个站台,若是找不到就直接加满
                {
                    double need_oil=(oil[i].pos-oil[k].pos)/d2;
                    if(now_oil<need_oil)
                    {
                        cost+=oil[k].cost*(need_oil-now_oil);
                        now_oil=0;
                    }
                    else now_oil-=need_oil;
                    k=i;
                    break;
                }
            }
            if(i!=k)        //没找到,直接加满,然后去寻找下个便宜的
            {
                cost+=(c-now_oil)*oil[k].cost;
                now_oil=c-(oil[k+1].pos-oil[k].pos)/d2;
                k++;
            }
        }
        printf("%.2lf\n", cost);
    }
    return 0;
}

 

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

P1016 旅行家的预算【模拟+贪心】【详解】 的相关文章

  • Codeforces Round 744 (Div. 3)

    A Casimir s String Solitaire 一个A需要一个B一个C需要一个B 所以只要A和C的个数之和等于B即可 AC代码 include
  • 消灭兔子【贪心+堆】

    题目链接 51nod 1191 消灭兔子 兔子这么可爱 怎么能消灭呢 我们可以用贪心的办法来解决这个问题 因为每个箭只能使用一次 所以 我们将兔子血量从高往低排列 先做掉高血量兔子 然后再看低血量兔子 保证了伤害高但是价值小的武器假如在之前
  • CCF-CSP201903-4-消息传递接口

    首先应当思考的是如何对输入数据进行存储 通过样例输入可以看出 每一个进程执行的操作数量都是不定的 因此可以采用 vectorg N 进行存储 其中g i 表示i号进程应执行操作 也可以采用queueq N 进行存储q i 表示i号进程应执行
  • NTSC和PAL制同步信号模拟输出

    NTSC和PAL制同步信号模拟输出 原由 由于我想输出一个NTSC制和PAL制的同步黑场 只需要输出同步信号 之后输出rgb信号给ADV 7123 后输出到显示屏 下面是我的心路历程和知识总结 一 了解NTSC和PAL PAL 电视标准 每
  • Working routine【Codeforces 706 E】【二维链表】

    Codeforces Round 367 Div 2 E 可以说是一道模拟题了 写了有些时候 可能是太菜了吧 题意 给出一个原始矩阵 之后有Q次操作 我们将两个矩阵交换位置 题目中保证两个矩阵不相交 给出的是两个矩阵的左上方的端点 以及它们
  • hdoj 1052 Tian Ji -- The Horse Racing 贪心算法

    这道题就是解决选择策略问题 思路一 先将田忌跟齐王的马的速度数组进行一次冒泡排序 1 如果田忌最慢的马比齐王最慢的马快 则比慢马 2 如果田忌最慢的马比齐王最慢的马慢 则用田最慢的马跟齐最快的马比 消耗齐的快马这是贪心的第一步 3 如果田忌
  • HDOJ 1052 Tian Ji -- The Horse Racing

    Tian Ji The Horse Racing Time Limit 2000 1000 MS Java Others Memory Limit 65536 32768 K Java Others Total Submission s 2
  • AcWing 104. 货仓选址

    题目 在一条数轴上有 N 家商店 它们的坐标分别为 A1 AN 现在需要在数轴上建立一家货仓 每天清晨 从货仓到每家商店都要运送一车商品 为了提高效率 求把货仓建在何处 可以使得货仓到每家商店的距离之和最小 输入格式 第一行输入整数N 第二
  • Bracket Coloring

    Bracket Coloring 题意 给出一个括号序列 定义漂亮序列为匹配括号序列或者反转之后是匹配括号序列的序列 现在要求染色 使得相同颜色的括号组成漂亮序列 问最少需要多少种颜色即每个括号染的颜色 思路 这里可以用栈来匹配括号序列 因
  • Maximum Diameter Graph 【CodeForces - 1082D】【搜索+构造】

    题目链接 一开始忘记输出有多少条边 WA了好几发都跑不过第一组测试样例 开始怀疑自己是不是读了道假题 然后在大佬们的帮助下 终于AC 好伤心 读假样例 一定是我太弱了 我的思想是采用了树链剖分的dfs 构造思想 可能是因为最近少用了树链剖分
  • 璀璨光滑【牛客】【题意解析+BFS+贪心】

    题目链接 中文题意 表面平静 实则暗藏玄机 而打开本题的突破口 也确确实实就在于题目的描述 也就是说 这张图的边的数目是确定的 并且这是一张连通图 而且图上的个点每个点连接出去的边的数目都是条 因为每个数都刚好只与个数在二进制位上差1 那么
  • 2.26—— 问题 B: 回文日期

    题目描述 在日常生活中 通过年 月 日这三个要素可以表示出一个唯一确定的日期 牛牛习惯用8位数字表示一个日期 其中 前4位代表年份 接下来2位代表月份 最后2位代表日期 显然 一个日期只有一种表示方法 而两个不同的日期的表示方法不会相同 牛
  • 【寒假每日一题】蛇形矩阵

    问题1 题目来源 AcWing 题目链接 756 蛇形矩阵 AcWing题库 题目描述 输入两个整数 n 和 m 输出一个 n 行 m 列的矩阵 将数字 1 到 n m 按照回字蛇形填充至矩阵中 具体矩阵形式可参考样例 输入格式 输入共一行
  • [leetcode] 球会落何处 模拟

    给出一个矩阵 里面的值为 1 or 1 1的时候是从左上到右下 1的时候是从左下到右上 当一个球从上方x 0 lt x lt m 放入之后 从哪个出口掉落还是无法从出口掉落 能通过的情况为 即某条线为 其左边的线也是 箭头所指为当前斜线 即
  • Add One

    Add One 题意 给一个数n 有m次操作 每次操作把n的每一位加一 例如1912操作一次后变成21023 问操作m次后 数字的位数 思路 可以初始化0 9每一个数字操作k次后的位数f i k k lt m 然后把n的每一位操作后的长度加
  • LeetCode-1827. 最少操作使数组递增【贪心,数组】

    LeetCode 1827 最少操作使数组递增 贪心 数组 题目描述 解题思路一 简单暴力 解题思路二 优化1 ans是操作数 mx是当前最大元素 mx无论如何会依次递增 解题思路三 优化2 遇到小的数就pre 1 否则变为num 题目描述
  • HDU--1050:Moving Tables (贪心)

    1 题目源地址 http acm hdu edu cn showproblem php pid 1050 2 解题思路 将每个输入的起始房间和结束房间转换为房间前面的区间 按区间起始位置从小到大排序 首先取第一个区间 后续如果有区间的起始位
  • 编程之美2015初赛第二场AB

    题目1 扑克牌 时间限制 2000ms 单点时限 1000ms 内存限制 256MB 描述 一副不含王的扑克牌由52张牌组成 由红桃 黑桃 梅花 方块4组牌组成 每组13张不同的面值 现在给定52张牌中的若干张 请计算将它们排成一列 相邻的
  • Basic Level 1018 锤子剪刀布 (20分)

    题目 大家应该都会玩 锤子剪刀布 的游戏 两人同时给出手势 胜负规则如图所示 现给出两人的交锋记录 请统计双方的胜 平 负次数 并且给出双方分别出什么手势的胜算最大 输入格式 输入第 1 行给出正整数 N 1 0 5
  • [POI2007]砝码Odw

    看这数据范围就不太可DP的样子 考虑贪心 首先注意到题目里有对于任意两个砝码其中一个是另一个质量整数倍的条件 所以砝码质量的种类不超过log INF 考虑按质量从小到大把砝码往容器里放 这样的话所有的砝码和容器的质量都可以除以当前砝码质量然

随机推荐

  • Failed to restart network.service: Unit network.service not found

    在配置完网络设置时重启时会出现这个问题 原因是和NetworkManager 服务有冲突 解决办法就是关闭NetworkManager然后重启一下Network服务 service NetworkManager stop 关闭Network
  • 创新奇智上市:是李开复心血之作 揭秘背后的塔尖孵化模式

    雷递网 雷建平 1月27日报道 青岛创新奇智科技集团股份有限公司 股份代号 2121 简称 创新奇智 今日在港交所上市 发行价为26 30港元 募资净额10 7亿港元 创新奇智开盘价与发行价持平 以开盘价计算 创新奇智市值超140亿港元 创
  • 用免费的谷歌GPU训练神经网络

    前提是先得注册一个google邮箱 再用该邮箱注册一个谷歌云盘 或者直接用这个谷歌邮箱就可以登陆云盘 1 云盘 网址应该是这个 https drive google com drive 不行就试一下这个 https drive google
  • 透视Matplotlib核心功能和工具包 - 不同图形格式

    Matplotlib创建的报告和仪表板可以以不同的方式使用 它们可以在上游Web应用程序中使用 也可以以PDF文件的形式分发 还可以嵌入到GUI工具箱中或在线交互式地使用 在此 我们将学习如何以各种格式保存报告 以便可以将它们分发给使用者以
  • 从零开始学WEB前端——HTML实战练习

    项目介绍 先做个自我介绍 本人是一个没人写前端所以就自学前端的后端程序员 在此项目中我会和大家一起从零基础开始学习前端 从后端程序员的视角来看前端 受限于作者的水平本项目暂时只会更新到前端框架VUE 不会涉及node js 该项目适合零基础
  • element dialog 垂直水平居中显示

    如何让组件中的dialog在可视区域垂直水平居中 先将dialog放到body的下层 保证自己写的样式相对于视口区域生效 element dialog文档中有个append to body属性 将其设置为true 会将dialog扔到bod
  • OpenWrt之kmod内核不兼容分析

    文章目录 OpenWrt之kmod内核不兼容分析 Kmod内核模块MD5校验 Kmod内核信息 强制安装kmod 解决kmod内核不兼容 查看CPU架构 feeds源参考 OpenWrt之kmod内核不兼容分析 Kmod内核模块MD5校验
  • GPAC MP4文件写入(支持H264、H265)

    1 GPAC模块下载链接https github com gpac gpac或https gpac wp imt fr downloads 2 编译指导https github com gpac gpac wiki Build Introd
  • 华为机试C语言-字符串处理

    题目描述 https pycoder blog csdn net article details 124656685 include
  • 【网络安全】Spring框架漏洞总结(一)

    Spring简介 Spring是Java EE编程领域的一个轻量级开源框架 该框架由一个叫Rod Johnson的程序员在2002年最早提出并随后创建 是为了解决企业级编程开发中的复杂性 业务逻辑层和其他各层的松耦合问题 因此它将面向接口的
  • rxjava 流式开发

    RxJava 是一种支持响应式编程的库 它允许您以流式方式处理异步事件序列 使用 RxJava 您可以将事件序列视为一个流 并使用丰富的操作符对这个流进行转换 过滤 组合等操作 以生成您所需的结果 在 RxJava 中 数据源可以是任何可观
  • MySQL 上机操作--数据库及数据表操作

    前言 如有不当之处 还望指正 一 上机目的 熟练掌握基本表的定义 删除与修改 为后继学习作准备 二 上机设备 1台计算机 数据库系统安装MySql 三 相关准备知识 3 1 掌握数据库的定义 删除与修改 3 2 掌握基本表的定义 删除与修改
  • 程序控制流图

    基本符号 ps 请将线看成弧线 doge 顺序结构 if选择结构 while循环结构 case多分支结构 控制流图由节点和控制流线 弧 两种符号组成 结点以标有编号的圆圈表示 用于表示程序流程图中矩形框 菱形框的功能 是一个或多个分支的语句
  • 10分钟上手Azure Blob Storage

    文章目录 Azure Blob Storage快速上手 背景 什么是Azure Blob Storage Blob Storage的应用场景 环境搭建 安装 运行 修改Blob Storage中的数据 基本操作 使用C 修改文件属性 遇到问
  • 平摊分析典型例题及解答

    Exercise 1 5 对某个数据结构执行大小为 n 的一个操作序列 若 i 为 2 的整数幂 则第 i 个操作的代价 为 i 否则为 1 请利用会计方法分析每次操作的平摊代价 Exercise 2 15 Bill 提出了一种叫做翻转堆栈
  • SpringClud Sleuth + Zipkin + Kafka实现分布式链路追踪

    SpringClud Sleuth Zipkin Kafka实现分布式链路追踪 使用步骤 使用步骤 1 导入 pom 依赖
  • 关于Spring Cloud Gateway 网关限流

    本文将使用以下两种方式实现网关的限流 使用 Spring Cloud Gateway 的 RequestRateLimiter 过滤器工厂基于 Redis 的限流 使用 Sentinel 结合 Spring Cloud Gateway 来实
  • vue动态组件component详解

    附上代码
  • 演唱会门票抢不到?不要慌,教你用python实现自动化抢票

    前言 之前有小伙伴留言说女朋友快生日了 喜欢某某某但是手动买票根本就是买不到 又不想当大冤种从黄牛手里加钱 于是乎在疯狂星期四的晚上遭到 贿赂 的我连夜搞定了 一丶安装环境和配置文件 要用python实现 下载和安装python自然是不用说
  • P1016 旅行家的预算【模拟+贪心】【详解】

    题目链接 思路 这道题是一道很明显的模拟题 但这道题也需要自己的理解 我自己写了些样例 然后找到了其中的模拟 我们假设从一个点出发 对于它的下一个点我们有很多选择 期间定义一个len用以记录满油 单次最远 到达距离 我们造访这条路上的所有点