汽车加油问题(动态规划)
问题描述
一个美国旅行代理商经常被要求去估计开车从一个城市旅行至另一个城市的最小费用。他有一个在通常路线上的大多数加油站的列表。列表包括了所有加油站的位置及当前每加仑汽油的价格。
为了简化估计费用的过程,代理商使用了以下的简化汽车驾驶员行为的规则:
● 除非汽车无法用油箱里的汽油达到下一个加油站(如果有的话)或目的地,在油箱里还有不少于最大容量一半的汽油时,驾驶员从不在加油站停下来。
● 在每一个停下的加油站,驾驶员总是将油加满。
● 在一个加油站停下之后,驾驶员将为旅程在快餐和糖果上花去2.00元。
● 在驶向加油站或目的地时,驾驶员不需要超过必须量的汽油。不需要“安全余量”。
● 驾驶员开始旅行时油箱总是满的。
● 每个加油站付款时四舍五入到分(1元等于100分)。
你必须写一个程序以估计驾驶员在旅程上至少要为汽油和食品付多少钱。
输入格式
开始的2行给出了出发地和目的地的信息。
数据的后继若干行代表了路线上的加油站,每个加油站用一行表示。下面是输入数据中数据项的精确格式及其含义。
第一行:一个实数——从出发地到目的地的距离(英里)。
第二行:三个实数及一个整数。
● 第一个实数是汽车油箱的最大的容量(加仑)。
● 第二个实数是汽车每加仑汽油可以行驶的英里数。
● 第三个实数是汽车在出发地城市加满油箱的费用(单位:元)。
● 整数(小于51)是路线上加油站的数目。
接下来的每一行:两个实数。
● 第一个实数是从出发地到加油站的距离(单位:英里)。
● 第二个实数是该加油站出售的汽油每加仑的价格(单位:分)。
数据项中的所有数据都是正的。一条路线上的加油站根据其到出发地的距离递增排列。路线上不存在这样的加油站,它到出发点的距离大于从出发点到目的地的距离。每条路线上的加油站都被适当的安排以使得任何汽车都能从出发地开到目的地。
输出格式
仅一个实数(保留两位小数),表示最小的花费(单位:元)。
样例输入
475.6
11.9 27.4 14.98 6
102.0 99.9
220.0 132.9
256.3 147.9
275.0 102.9
277.6 112.9
381.8 100.9
样例输出
27.31
这道题虽然很简单,但是那个条件想起来还是比较麻烦。
一开始WA80,是因为没有理解题意。
我是把终点当做了一个加油站,其实不能这样,因为这句话:
● 除非汽车无法用油箱里的汽油达到下一个加油站(如果有的话)或目的地,在油箱里还有不少于最大容量一半的汽油时,驾驶员从不在加油站停下来。
但是是可以有不少于容量一半的汽油到达终点。
所以应该枚举距离不超过油量限制的最后一个点,找到最小解。
#include <cstdio>
#define min(a,b) ((a)<(b)?(a):(b))const double eps = 1e-8;
const double inf = 1e19;
double d[60];
double v[60];
double D,S,M,init;
long n;
double f[60];int main()
{freopen("oil.in","r",stdin);freopen("oil.out","w",stdout);scanf("%lf%lf%lf%lf%ld",&D,&S,&M,&init,&n);for (long i=1;i<n+1;i++){scanf("%lf%lf",d+i,v+i);v[i] /= 100.0;}for (long i=1;i<n+1;i++)f[i] = inf; f[0] = init;for (long i=1;i<n+1;i++){for (long j=i-1;j>=0;j--){if (d[i]-d[j] > M*S+eps)break;if (d[i]-d[j] > M*S/2+eps){f[i] = min(f[i],f[j]+v[i]*((d[i]-d[j])/M)+2);}}}double ans = 1e19;for (long i=n;i>=0;i--){if (D - d[i] > M*S+eps)break;ans = min(ans,f[i]);}printf("%.2lf",ans);return 0;
}
汽车加油问题(动态规划)相关推荐
- 算法分析与设计实验报告——实现汽车加油问题
算法分析与设计实验报告--实现汽车加油问题 目录: 算法分析与设计实验报告--实现汽车加油问题 一. 实验目的 二.实验要求 三. 实验原理 四. 实验过程(步骤) 五. 运行结果 六.实验分析与讨论 ...
- 【贪心算法】虚拟汽车加油问题
算法实现题 4-9 虚拟汽车加油问题 问题描述: 一辆虚拟汽车加满油后可以行驶n km.途中有若干个加油站.设计一个有效的算法,指出应在那个加油站停靠加油,使沿途加油次数最少. 算法设计: 给定n和k ...
- 孤岛营救与汽车加油行驶问题
题目链接:https://www.luogu.org/problemnew/show/P4011 (孤岛营救)|| https://www.luogu.org/problemnew/show/P400 ...
- 【线性规划与网络流24题】汽车加油行驶问题 分层图
汽车加油行驶问题 Time Limit: 1 Sec Memory Limit: 128 MB Description 给定一个 N*N的方形网格,设其左上角为起点◎,坐标为( 1,1),X轴向右为 ...
- 算法设计与分析——贪心算法——汽车加油问题
汽车加油问题:一辆汽车加满油后可行驶n公里,旅途中有若干个加油站,两加油站间距离不超n 公里,起点离第一个加油站距离及最后一个加油站离终点距离也不超过n公里.算法给出应在哪些加油站停靠加油,使沿途加油 ...
- 贪心----汽车加油问题
汽车加油问题 Time Limit: 1000 ms Memory Limit: 65536 KiB`` Problem Description 一辆汽车加满油后可行驶n公里.旅途中有若干个加油站.设 ...
- Pta题目集:汽车加油问题 (20 分)
7-40 汽车加油问题 (20 分) 题目来源:王晓东<算法设计与分析> 一辆汽车加满油后可行驶 n公里.旅途中有若干个加油站.设计一个有效算法,指出应 在哪些加油站停靠加油,使沿途加油次 ...
- 最优服务次序问题 和 汽车加油问题
最优服务次序问题 问题描述: 设有n个顾客同时等待一项服务.顾客i需要的服务时间为ti, 1≦i ≦n .共有s处可以提供此服务.应如何安排n个顾客的服务次序才能使平均等待时间达到最小平均等待时间是n ...
- c++用贪心算法解决汽车加油问题
汽车加油问题 Time Limit: 1000 ms Memory Limit: 65536 KiB 一辆汽车加满油后可行驶n公里.旅途中有若干个加油站.设计一个有效算法,指出应在哪些加油站停靠加油, ...
最新文章
- mysql mysqldump只导出表结构或只导出数据的实现方法
- [zt]数学之美番外篇:平凡而又神奇的贝叶斯方法
- 模拟电路基础秦世才_模拟电子技术基础碎片化-晶体管及放大电路基础
- hibernate QBC检索方式查询
- 2019.4.1考试2019.4.2考试2019.4.4考试
- 解读ImageView的wrap_content和adjustViewBounds的工作原理
- 地理模块化施工的优点_模块化建筑适合学校的6个原因
- java中异常与return
- jsp文件命名规范_代码规范整理
- Spring mvc 中 DispatcherServlet 的学习和理解
- 机器学习入门笔记(一):模型性能评价与选择
- 数据库多表链接查询的方式
- 5分钟实现微信云小程序支付功能(含源码)
- 华为手机如何给应用加锁_如何设置华为手机应用程序锁?
- C# 编辑器 Editor
- 编码解码--url编码解码
- 虚拟机里博图能连接上实物PLC,但是HMI仿真不能连接实物PLC
- sql server 自定义背景、字体及显示行数
- vs2015设置c语言,VS2015的使用
- 像写Flutter一样开发Android原生应用