CSP-J 2023 真题 公路 题解(普及-)|排序之后贪,才有正确性
继续刷 CSP-J 2023 真题。这题考点是贪心先把题意吃透。题目来源ACGO A7124 洛谷 P9749难度定位普及- 通过率41.98%一、题目信息题目名称公路所属赛事2023 年 CSP-J 组复赛官方难度普及-涉及知识点贪心题目链接https://www.acgo.cn/problemset/info/7124洛谷编号P9749同一道题两个平台均可提交代码通用易错点很多人栽在这贪心策略写完先找反例证明不了就别急着交注意排序的稳定性相同关键字的处理顺序可能影响答案题意简述题意其实很直白小苞准备开着车沿着公路自驾。公路上一共有 n 个站点编号为从 1 到 n。其中站点 i 与站点 i 1 的距离为 v_i 公里。公路上每个站点都可以加油编号为 i 的站点一升油的价格为 a_i 元且每个站点只出售整数升的油。小苞想从站点 1 开车到站点 n一开始小苞在站点 1 且车的油箱是空的。已知车的油箱足够大可以装下任意多的油且每升油可以让车前进 d 公里。问小苞从站点 1 开到站点 n至少要花多少钱加油前置知识这题要用到的工具不多但有一个容易忘先过一遍。局部最优推全局贪心的难点是「证明这样贪是对的」。写完代码前先问自己有没有反例换一种贪法会不会更优二、思路分析这题官方难度普及-开考半小时内比较稳妥。思路的入口在哪里可以考虑贪心。首先我们发现在 1 号加油站必须买油否则根本动不了。接下来你可以不断开到在当前加油站后比当前加油站油价低的加油站并使油剩得最少。什么意思拿样例来说就是这样5 410 10 10 109 8 9 6 52 号加油站是我们要开到的第二个加油站因为 2 号加油站的油价oil_2oil_1 同时我们只买 3 升油这样能开到 2 号加油站并使油剩得最少。2 号站后我们要到 4 号站去原因同上。为什么呢假如我们现在有一排加油站第i 个加油站的油价是 i1 站的距离是 dis_i 。你先处理出 1 号加油站到 i 号加油站的总距离 sum_i​假如我们现在在 a 号加油站要去 b 号加油站中间有个 c 号加油站且 按照我们的策略我们一定要去 c。三、完整代码#include iostream #include vector #include cstdio using namespace std; // CSP-J 2023 公路 // 站点 i 到 i1 距离 v_i站点 i 每升油 a_i 元每升跑 d 公里。 // 油箱无限大。贪心在「当前能到的站点中价格最低」的那个站尽量加满。 // 具体做法记当前油还能跑 rest 公里到 i 站时。 // 每到一个站若本站价格比后面能到的站都低就加够到下一个更便宜站所需的油。 int main() { int n; long long d; cin n d; vectorlong long v(n 1, 0); // v[i]: i - i1 的距离 for (int i 1; i n - 1; i) cin v[i]; vectorlong long a(n 1); for (int i 1; i n; i) cin a[i]; // 单调栈求每个站点右边第一个价格更小的站点 vectorint nxtSmaller(n 2, n 1); { vectorint stk; for (int i n; i 1; --i) { while (!stk.empty() a[stk.back()] a[i]) stk.pop_back(); nxtSmaller[i] stk.empty() ? (n 1) : stk.back(); stk.push_back(i); } } long long cost 0; long long rest 0; // 到达当前站点时还能跑的公里数 for (int i 1; i n - 1; i) { // 从 i 走到 nxtSmaller[i] 的总距离 int j nxtSmaller[i]; // j n 或 n1 long long need 0; for (int k i; k (j n 1 ? n : j); k) need v[k]; // 在 i 站把油加到「刚好能跑到 j」或「跑完全程」 if (j n 1) { // 后面没有更便宜的直接在这加满到终点 long long total 0; for (int k i; k n - 1; k) total v[k]; if (rest total) { long long buy (total - rest d - 1) / d; // 需要买的升数上取整 cost buy * a[i]; rest buy * d; } break; } else { if (rest need) { long long buy (need - rest d - 1) / d; cost buy * a[i]; rest buy * d; } } rest - v[i]; // 开到 i1 } cout cost \n; return 0; }四、代码分段拆解完整代码在上面下面按功能分块解释。头文件与全局变量先把用到的头文件和全局变量放上来。全局变量在竞赛里很常用好处是函数之间共享方便代价是要小心初始化和被意外改写。#include iostream #include vector #include cstdiousing namespace std; int main() { int n; long long d; vectorlong long v(n 1, 0); // v[i]: i - i1 的距离 vectorlong long a(n 1); vectorint nxtSmaller(n 2, n 1); vectorint stk;主体逻辑主体部分按顺序完成读入、计算、输出。main函数尽量保持线性把复杂的逻辑拆成独立函数出问题时更容易定位。边界处理这类题最容易在边界上翻车最小值、最大值、只剩一个元素的情况都在脑中过一遍。五、实例模拟光看代码容易虚用样例实测一遍最踏实。样例 1输入5 4 10 10 10 10 9 8 9 6 5输出79以第一组样例为例输入是5 4、10 10 10 10、9 8 9 6 5正确输出是79。建议把这两行数据抄在纸上用上面的代码手动走一遍重点看循环变量怎么变化、答案在哪一步被更新。能自己推出来的东西比看懂代码印象深得多。六、踩坑总结最后总结几个要点。贪心策略写完先找反例证明不了就别急着交注意排序的稳定性相同关键字的处理顺序可能影响答案另外提醒一句这题在 CSP-J 2023 里是普及-难度考场上如果没有把握拿满分先把暴力写法交上去拿到部分分再回头优化。CSP 是打分制空着不写才是最亏的。七、知识点拓展这题的核心是贪心。贪心题的正解往往是「排序 一次扫描」。判断能不能贪关键是找一个交换论证如果两个元素的顺序换过来答案不会变差那按某个关键字排序就是对的。建议的练习路径先把本题独立写一遍不看代码遇到卡壳再看提示换个平台提交ACGO 和洛谷都试试确保代码在两个平台都能过找两到三道同类型的题练手巩固这类问题的识别能力八、适用人群这道题的适用面刚学完循环和数组想找真题练手的同学准备 GESP 三到四级、想提前接触 CSP 风格的同学想弄明白贪心类问题标准解法的同学代码有任何问题欢迎指正我会及时更新。关于这个系列这是「CSP 真题逐题精讲」的第 36 篇。我会按年份从 2019 一路刷到 2025CSP-J 和 CSP-S 全覆盖。每篇都给双平台题号ACGO 洛谷 逐行代码拆解 真实样例模拟。跟着刷完这一套CSP 第一轮的选择题和基础题基本就稳了。下一篇CSP-J 2023 一元二次方程普及/提高- 关注我不错过后续更新。评论区告诉我你现在刷到哪一年了我看看能不能按大家的进度调整更新节奏。

相关新闻

Guava IO模块:Java高效IO操作实践指南

Guava IO模块:Java高效IO操作实践指南

1. Guava IO 模块概述Guava IO 是 Google Guava 工具库中专门针对 Java IO 操作进行优化的模块。作为 Java 开发者,我们经常需要处理各种 IO 操作,但 JDK 原生 IO API 存在诸多痛点:资源管理繁琐、代码冗余、异常处理复杂等。Guava IO 通过提…

2026/10/14 10:05:17 阅读更多 →
Python async/await实战:用非阻塞I/O告别CPU空转

Python async/await实战:用非阻塞I/O告别CPU空转

如果你写过需要同时请求几十个外部接口的脚本,大概率遇到过这样的场景:程序明明只是等对方响应,CPU却空转了大半时间,一个请求慢,后面的全被拖死。Python里解决这种“白等”问题的正统方案,就是async和awai…

2026/10/14 10:05:17 阅读更多 →
从T+1到秒级:自建实时事件分析平台REA全流程实践

从T+1到秒级:自建实时事件分析平台REA全流程实践

前一阵某团队的监控群里大半夜炸锅了:离线报表任务跑挂,数据一直到早上九点才恢复,运营同学打开后台发现昨天的核心指标还是空的。这种场景对做数据的人来说太熟悉了。T1的离线分析在数据量小的时候还行,一旦业务节奏变快、指标口…

2026/10/14 10:05:17 阅读更多 →

最新新闻

SSM+Django混合架构在鲜花电商系统的实践与优化

SSM+Django混合架构在鲜花电商系统的实践与优化

1. 项目概述:当鲜花遇上全栈技术 这个看似传统的网上花店系统,实际上是一个融合了Java企业级开发与Python快速迭代优势的复合型项目。SSM(SpringSpringMVCMyBatis)作为后端核心框架,提供了稳定的订单处理和库存管理能力…

2026/10/14 12:55:56 阅读更多 →
智能数据分析平台有哪些?五个主流平台的数据模型与选型对比

智能数据分析平台有哪些?五个主流平台的数据模型与选型对比

摘要: 面对多样化的企业数据分析诉求,不同分析平台在底层数据组织、模型设计与分析颗粒度上存在显著差异。本文对比 GrowingIO、FineBI、Tableau、Power BI 与 Quick BI 五个平台的技术架构特征、核心计算模型、协同方式及部署要求,结合多源数…

2026/10/14 12:55:56 阅读更多 →
视觉重定位:层级场景坐标回归如何拆解分类与回归难题

视觉重定位:层级场景坐标回归如何拆解分类与回归难题

1. 视觉重定位到底在解决什么问题视觉重定位这个词,第一次接触的人容易把它和SLAM搞混。SLAM是"一边走一边建图,同时知道自己在哪里",而重定位是"我手里有一张图,或者我正站在某个位置拍了一张照片,我要…

2026/10/14 12:55:56 阅读更多 →
SR-IOV网卡虚拟化:硬件级VF分流原理与生产落地实践

SR-IOV网卡虚拟化:硬件级VF分流原理与生产落地实践

1. 项目概述:为什么一张网卡要“分身”成几十个独立网口?你有没有遇到过这种场景:一台服务器上跑着十几个虚拟机,每个都要直连物理网络,低延迟、高吞吐、零丢包——结果发现宿主机的网卡成了瓶颈?CPU软中断…

2026/10/14 12:55:56 阅读更多 →
SpringBoot+Vue党员教育管理系统开发实践

SpringBoot+Vue党员教育管理系统开发实践

1. 项目背景与核心价值 党员教育和管理系统是当前基层党组织数字化转型的重要工具。这个基于SpringBootVue的全栈项目,完美契合高校计算机专业毕业设计的选题要求,同时具备实际应用价值。我在参与某机关单位党建系统升级时,深刻体会到这类系统…

2026/10/14 12:55:56 阅读更多 →
podofo-0.9.5-vs2013-x86:老项目里PDF解析库的集成与避坑指南

podofo-0.9.5-vs2013-x86:老项目里PDF解析库的集成与避坑指南

简介:Podofo 0.9.5 在 Visual Studio 2013 下编译生成的 x86 预编译库,面向需要在 Windows 平台读写、编辑 PDF 文件的 C 开发者。Podofo 是一套开源 PDF 处理库,支持元数据读取、页面渲染、文本抽取、文档生成等常用能力,本包省去…

2026/10/14 12:54:56 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →