当前位置: 首页 > news >正文

洛谷P1016——旅行家的预算

这是一道贪心算法的题,算法核心是根据距离和油量价格的更新策略,以最小的开销到达目的地。

算法思路:

代码:

#include <iostream> #include <vector> #include <algorithm> #include <iomanip> #include <limits> using namespace std; struct Station { double distance; // 到起点的距离 double price; // 油价 }; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); double S, C, L, P0; int N; cin >> S >> C >> L >> P0 >> N; vector<Station> stations(N + 2); stations[0] = { 0.0, P0 }; // 起点 for (int i = 1; i <= N; i++) { cin >> stations[i].distance >> stations[i].price; } stations[N + 1] = { S, 0.0 }; // 终点虚拟站,油价不计 // 按距离排序 sort(stations.begin(), stations.end(), [](const Station& a, const Station& b) { return a.distance < b.distance; }); double maxDistancePerFullTank = C * L; // 检查是否存在不可达情况 for (int i = 1; i <= N + 1; i++) { if (stations[i].distance - stations[i - 1].distance > maxDistancePerFullTank) { cout << "No Solution\n"; return 0; } } double totalCost = 0.0; // 总费用 double currentFuel = 0.0; // 当前油量(升) int cur = 0; // 当前所在站点索引 while (cur < N + 1) { // 到终点前循环 double maxReach = stations[cur].distance + maxDistancePerFullTank; int nextStation = -1; double minPriceInRange = numeric_limits<double>::max(); // 遍历可达范围内的加油站 for (int i = cur + 1; i <= N + 1; i++) { if (stations[i].distance > maxReach) break; if (stations[i].price < stations[cur].price) { // 找到比当前站油价低的第一个站 nextStation = i; break; } // 否则记录可达范围内最便宜的站 if (stations[i].price < minPriceInRange) { minPriceInRange = stations[i].price; nextStation = i; } } double neededFuel = (stations[nextStation].distance - stations[cur].distance) / L; if (stations[nextStation].price < stations[cur].price) { // 下一站比当前便宜,只加够油 if (currentFuel < neededFuel) { totalCost += (neededFuel - currentFuel) * stations[cur].price; currentFuel = neededFuel; } } else { // 当前站是可达范围内最便宜的,加满油 if (currentFuel < C) { totalCost += (C - currentFuel) * stations[cur].price; currentFuel = C; } } // 驶向下一站 currentFuel -= neededFuel; cur = nextStation; } cout << fixed << setprecision(2) << totalCost << "\n"; return 0; }

说明:
(1)ios::sync_with_stdio(false):用于断开C++标准流(cin/cout)与C标准流(scanf/printf)的同步,取消默认的缓冲区共享,从而大幅提升读写速度

(2)cin.tie(nullptr):解除cincout的绑定,避免不必要的刷新开销

在处理大型文本文件、大规模数据、限时竞赛中可以使用此方法提升效率(本题数据规模小可不用)

http://www.jsqmd.com/news/470384/

相关文章:

  • 2026年中国大模型发展趋势与AGI范式探索:分化、自主学习与Agent战略
  • 2026.3.10Linux
  • [工具] 影子生成器 批量影子生成器 自动修改原偏移坐标文件
  • 太原哪里卖葡萄糖
  • SpringBoot使用AOP优雅的实现系统操作日志的持久化!
  • 动态规划算法的剪枝条件与判定准则的技术6
  • 30 分钟上手 OpenClaw!Windows 搭建跨平台 AI 助手,打破智能生活的边界
  • 短语解析:Oh my!
  • 工业可解释性分析
  • 智慧AI人员行为识别 人员跌倒监测 行人跌倒识别 老人跌倒监控识别 人员躺站识别数据集第10539期
  • 【垃圾箱包装问题-Matlab】【使用遗传算法(GA)解决垃圾箱包装问题Matlab代码】
  • JavaScript性能优化实战玖兴
  • Java注解
  • 通俗具体解释paxos
  • Linux 目录结构与常用命令速查(服务器必备)
  • Context7 MCP:智能文档检索与代码示例系统深度解析
  • speckit + AI IDE开发前后端项目,AI加持开发
  • FPGA内部模块详解之三 FPGA的“记忆细胞”——嵌入式块内存(Block RAM)
  • 手术头灯摄像如何解决术野遮挡问题:手术影像采集技术分析
  • Scala的使用方式
  • 云原生-docker逃逸
  • 基于SpringBoot+Vue的学校网络运维系统毕设项目(完整源码+论文+部署)
  • TMC2660C 寄存器功能位详解--开发笔记
  • 推理框架极简入门与实战指南(非常详细),Nano-vLLM从入门到精通,收藏这一篇就够了!
  • Flutter 三方库 xflutter_cli 的鸿蒙化适配指南 - 让架构开发快如闪电,打造鸿蒙应用专家级的模式发生器
  • 终端指令汇总
  • 2026 AI 工具排行榜:ChatGPT、DeepSeek、Claude、Gemini 谁更强?
  • 【JDBC】面向对象的思路编写JDBC程序
  • PostGIS实现栅格数据基本信息读取【ST_Rotation】等4个函数(二)
  • 【最新版本】OpenClaw(小龙虾) 完整安装指南!含Skills使用教程!