题目

题目链接

题解

贪心。


贪心思路:

再次更新,2022.4.15
做PTA时发现一道类似的题目,看了题解发现,下面的思路不对。
策略中有一点要注意的,如果下一个能到达的加油站中,有多个加油站比当前加油站便宜,不是选择最便宜的那个,而实选择离当前加油站最近的那个(尽管这个加油站不是最便宜的)
因为我们完全可以先到达比较便宜的加油站,再到达最便宜的加油站,这样一定比直接从当前加油站到最便宜的加油站要划算。

更新于2022.4.3
本来以为之前的思路出现问题了,结果发现没问题……

以下所说的加油站忽略最后一个,即忽略终点,终点用于特殊判断。(当前加油站处车的油量任意,即不影响我们后续的决策)从当前加油站开始向后找加油站:1. 若没有能到达的加油站(所谓“能到达”就是指加满油后可达),则进行下面的判断:(1) 无法到达终点,则直接No Solution;(2) 可以到达终点,则直接到达终点。2. 若有能到达的加油站,:(1) 若找能到达的加油站中油价最低的加油站的油价比当前的加油站油价低,则选择这个加油站作为目的地,油量加到刚好能到达找到的加油站即可;(2) 若这个加油站的油价比当前的加油站油价高,则判断是否能直接到达终点:① 若能直接到达终点,则直接到达终点;② 若不能直接到达终点,则在当前加油站加满油,将找到的加油站作为目的地。
以下所说的加油站忽略最后一个,即忽略终点,终点用于特殊判断。从能能到达的加油站中选一个油价最低的加油站进行判断:若没有能到达的加油站:无法到达终点,则直接No Solution;可以到达终点,则直接到达终点。若有能到达的加油站:若这个加油站的油价比当前的加油站油价低,则选择这个加油站作为目的地,油量加到刚好能到达找到的加油站即可;若这个加油站的油价比当前的加油站油价高,则判断是否能直接到达终点:若能直接到达终点,则直接到达终点;若不能直接到达终点,则在当前加油站加满油,将找到的加油站作为目的地。

理解性地讲述一下:
肯定是要找便宜的加油站,但是这个所能到达的最便宜的加油站的油价有可能比当前所在的加油站的油价贵。贵的话,我们就直接在当前加油站加满油,尽量在那个虽然比较便宜但是仍比当前加油站贵的加油站少加点油,省点钱。如果最便宜的加油站比当前的便宜,那我只要把油加到刚好能到那里的量即可,之后的油可以到了便宜的加油站再加,要是在当前加油站加多了直接血亏。
如果前面的加油站我都到不了,我完蛋了,根本不可能到达终点。只要看我油箱全部加满能不能到达某个加油站就能判断我还是不是能前进了。
还有小细节,比如我要是前面能到的加油站中最便宜的也比我当前的贵,但是我可以在当前加油站加满,一口气直接开到终点,那么我也完全没必要在中间的加油站停留。


注意四舍五入:
(int(a*100+0.5))/100.0
a进行保留小数点后两位的操作。

代码

/*
代码中的部分注释通过代号 step? 简略表示step1:从能到达的加油站中选一个油价最低的加油站进行判断
step2:若没有能到达的加油站,且到不了终点则直接No Solution;
step3:若没有能到达的加油站,但能到终点则直接到达终点
step4:若有能到达的加油站,且这个加油站的油价比当前的加油站油价低,则选择这个加油站作为目的地,油量加到刚好能到达找到的加油站即可
step5:若有能到达的加油站,但这个加油站的油价比当前的加油站油价高,则判断是否能直接到达终点
step6:若能直接到达终点就到达终点;
step7:若不能直接到达终点则在当前加油站加满油,前往找到的加油站 */
#include<bits/stdc++.h>
using namespace std;int n;
double des, c, unitdist, sp, rest, cost;struct node {double pos, p;
} oil[100];bool cmp(node a, node b) {return a.pos < b.pos;
}int main()
{cin>>des>>c>>unitdist>>sp>>n;oil[0].p = 100; // 设置为极大值 oil[1].pos = 0; oil[1].p = sp; n++;for(int i = 2;i <= n;i ++) cin>>oil[i].pos>>oil[i].p;int t = 1;while(t <= n) { // rest表示到达加油站t时还剩多少油,cost表示从头开始到达加油站t后面的下一个目的地需要花费的总钱数 double cangodist = c*unitdist; // 最远能到多远 int pos = 0;for(int i = t+1;i <= n;i ++) // step1 if(oil[pos].p > oil[i].p) // 能到达的加油站中最便宜的一个 pos = i;if(!pos) { // 没有能到的 if((des-oil[t].pos)/unitdist > c) {puts("No Solution"); return 0;} // step2else {cost += ((des-oil[t].pos)/unitdist - rest)*oil[t].p; break;} // step3}if(oil[pos].p < oil[t].p) { // step4cost += ((oil[pos].pos - oil[t].pos)/unitdist - rest)*oil[t].p; // (从t到pos需要的油 - 油箱里剩余的油) * 在t加油站加油的油价 rest = 0; // 因为油要加到刚好到达pos加油站的量,因此,到达加油站pos时油剩余0 t = pos;} else { // step5if((des-oil[t].pos)/unitdist <= c) { // step6cost += ((des-oil[t].pos)/unitdist - rest)*oil[t].p; //  (从t到终点需要的油 - 油箱里剩余的油) * 在t加油站加油的油价 break;} else { // step7cost += (c-rest)*oil[t].p; // 在t加油站将油加满 rest = c - (oil[pos].pos - oil[t].pos)/unitdist; // 加满油后,行驶到pos加油站还剩多少油 t = pos;}}}printf("%.2lf\n", (int(cost*100+0.5))/100.0); // 四舍五入的经典方式 return 0;
}

蓝桥杯算法训练VIP-旅行家的预算相关推荐

  1. [蓝桥杯][算法训练VIP]旅行家的预算(单调栈+贪心)

    题目描述 一个旅行家想驾驶汽车以最少的费用从一个城市 到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2.出发点每升汽油价格P ...

  2. Java实现蓝桥杯 算法训练 ALGO-15 旅行家的预算

    问题描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2.出发点每升汽油价格P和沿 ...

  3. [蓝桥杯][算法训练VIP]方格取数(双线程dp)

    题目描述 设有N * N的方格图(N< =10),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0. 某人从图的左上角的A 点(1,1)出发,可以向下行走,也可以向右走,直到到达右下 ...

  4. [蓝桥杯][算法训练VIP]摆动序列(深搜+回溯||动态规划)

    题目描述 如果一个序列满足下面的性质,我们就将它称为摆动序列: 序列中的所有数都是不大于k的正整数: 序列中至少有两个数. 序列中的数两两不相等: 如果第i – 1个数比第i – 2个数大,则第i个数 ...

  5. [蓝桥杯][算法训练VIP]接水问题(思维)

    题目描述 学校里有一个水房,水房里一共装有m个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为1.现在有n名同学准备接水,他们的初始接水顺序已经确定.将这些同学按接水顺序从1到n编号,i号同学的 ...

  6. [蓝桥杯][算法训练VIP]单词接龙(DFS+String)

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都 最多在"龙&quo ...

  7. [蓝桥杯][算法训练VIP]王、后传说(深搜+回溯)

    题目描述 地球人都知道,在国际象棋中,后如同太阳,光芒四射,威风八面,它能控制横.坚.斜线位置. 看过清宫戏的中国人都知道,后宫乃步步惊心的险恶之地.各皇后都有自己的势力范围,但也总能找到相安无事的办 ...

  8. [蓝桥杯][算法训练VIP]乘积最大(动态规划)

    题目描述 今年是国际数学联盟确定的"2000--世界数学年",又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一 ...

  9. [蓝桥杯][算法训练VIP]麦森数(Java大数+快速幂)

    题目描述 形如2p-1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果P是个素数,2p-1不一定也是素数.到1998年底,人们已找到了37个麦森数.最大的一个是P=3021377,它有9 ...

  10. [蓝桥杯][算法训练VIP]黑白无常(dfs)

    题目描述 某寝室的同学们在学术完之后准备玩一个游戏: 游戏是这样的,每个人头上都被贴了一张白色或者黑色的纸,现在每个人都会说一句话"我看到x张白色纸条和y张黑色的纸条",又已知每个 ...

最新文章

  1. 关于工作流引擎的设计讨论
  2. php如何实现用户报警,php封装实现钉钉机器人报警接口的示例代码
  3. python爬虫实例(urllibBeautifulSoup)
  4. springboot2使用JUnit5单元测试使用大全
  5. mongodb单表最大记录数_SpringBoot+Cloud全家桶微服务实战项目之文档型数据库MongoDB四...
  6. js 查错_7年前端开发经验的我,写了本Vue.js实战开发,开源高清PDF下载
  7. win10下vscode配置c语言环境
  8. 常系数线性递推的第n项及前n项和(转载)
  9. 路由 mysql,Mysql复制之路由
  10. 小米架构调整:拆分成立人工智能部,直接向CEO雷军汇报
  11. 一个项目的404错误处理页面
  12. 西门子S7200PLC连接CHNet-S7200PD实现以太网通信配置方法
  13. 教你,用java生成验证码(这这太简单了了吧!!!!!!!)
  14. ddr3ddr4 lpddr4速率_LPDDR3一定弱?实测对比单双通道DDR4
  15. Win10系统设置开机默认开启数字小键盘
  16. 2020最新抖音上热门技巧你知道了几个?
  17. Android Studio gradle 自定义签名设置
  18. 华为HCNA路由技术篇—OSPF协议细节详解
  19. 《群山唱响》-- 爱的力量
  20. 数据挖掘 顶级期刊_数据挖掘领域顶级会议期刊及其分析

热门文章

  1. 教育分期被“消费贷”,教培机构 “蒙冤记”
  2. 使用while/do-while/for循环三种方式打印100以内4的倍数
  3. 二、八、十、十六进制介绍及进制转换
  4. 电商收付通可视化进件二级商户,多功能升级
  5. MAStudio三步打造移动OA系统开发生态链
  6. 1009 Problem I
  7. iOS HID蓝牙协议
  8. Python + Django4 搭建个人博客(十五):注册功能页面实现
  9. 预约下单同城服务小程序开发
  10. 输出0到100之间所有的素数