洛谷 P1016 旅行家的预算 模拟+贪心
题面
题目链接
题目描述
一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离 $ D_1 $ 、汽车油箱的容量 $ C $ (以升为单位)、每升汽油能行驶的距离 $ D_2 $ 、出发点每升汽油价格 $ P $ 和沿途油站数 $ N $ ( $ N $ 可以为零),油站i离出发点的距离 $ D_i $ 、每升汽油价格 $ P_i (i=1,2,...,N) $ 。计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出“No Solution”。
输入输出格式
输入格式
第一行,$ D_1,C,D_2,P,N $ 。
接下来有 $ N $ 行。
第 $ i+1 $ 行,两个数字,油站 $ i $ 离出发点的距离 $ D_i $ 和每升汽油价格 $ P_i $ 。
输出格式
所需最小费用,计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出“No Solution”。
输入输出样例
输入样例
275.6 11.9 27.4 2.8 2
102.0 2.9
220.0 2.2
输出样例
26.95
说明
$ N \leq 6 $ , 其他数字 $ \leq 500 $
【时空限制】
1000ms,128MB
思路
这道题还真有点麻烦。不过数据规模很小,乱搞搞应该是都能AC的。那我来介绍一种贪心的方法。
首先不妨记起点为第0个加油站,终点为第N+1个加油站且加油价格为0,那么我们可以以如下方式贪心
1.从当前点向后寻找加满油可到的,且油价比当前点小的点。如果当前点不加油可以到达,那么就走过去;否则需要多少油就加多少油(因为走过这个加油站就可以用当前加油站油价更低的油了,多加无用)
2.如果找不到(1)中所述的加油站,那么向后寻找加满油可到的,且油价尽量低的点。然后加满油过去(如果不加满而选择到下一个点加油,那就浪费了)
3.如果没有点可走,那就No Solution
除此之外,如果到终点还有油,那么显然是浪费了。所以我们应该在上一个加油的地方少加一点油,这可以等效为把油带回去卖掉。故每次加油要记录上次加油的位置
AC代码
#include<bits/stdc++.h>
using namespace std;
int n;
double L,V,D;
double d[8],w[8];
double ans;
int main()
{
cin>>L>>V>>D>>w[0]>>n;
for(int i=1;i<=n;i++) cin>>d[i]>>w[i];
d[n+1]=L,w[n+1]=0;
int np=0,last=0;
double nv=0;
while(1)
{
int v;
bool f=false;
for(v=np+1;v<=n+1;v++)
if(w[v]<w[np] && V>=(d[v]-d[np])/D)
{
if(nv>=(d[v]-d[np])/D) nv-=(d[v]-d[np])/D,np=v;
else ans+=((d[v]-d[np])/D-nv)*w[np],np=v,nv=0,last=np;
f=true;break;
}
if(!f)
{
double mi=1000000;
int p=-1;
for(v=np+1;v<=n+1;v++)
if(w[v]<mi && V>=(d[v]-d[np])/D) mi=w[v],p=v;
if(p==-1) {cout<<"No Solution";return 0;}
else ans+=(V-nv)*w[np],nv=V-(d[p]-d[np])/D,np=p,last=np;
}
if(np==n+1) break;
}
ans-=nv*w[last];
printf("%.2f",ans);
return 0;
}
总结
1.遇到数据小的题要有多种思路
2.要自己动手模拟
洛谷 P1016 旅行家的预算 模拟+贪心的更多相关文章
- 洛谷 P1016 旅行家的预算
P1016 旅行家的预算 题目OJ链接https://www.luogu.org/problemnew/show/P1016 题目描述一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时 ...
- [NOIP1999] 提高组 洛谷P1016 旅行家的预算
题目描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2.出发点每升汽油价格P和沿 ...
- 洛谷P1016 旅行家的预算
题目描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2.出发点每升汽油价格P和沿 ...
- 洛谷P1016 旅行家的预算 题解
主要就是注意一下各个变量的类型别弄混了 https://www.luogu.org/problem/P1016 #include<cstdio> using namespace std; ...
- 洛谷 P1016 旅行者的预算
传送门 感觉自己连点生活常识都没有,竟然连油用过之后要减去都不知道,这种贪心模拟题都做不出来--思路在代码里,我菜死了 思路&&代码 //看题解过的..一点都没有成就感 #includ ...
- 洛谷P5019 铺设道路 题解 模拟/贪心基础题
题目链接:https://www.luogu.org/problemnew/show/P5019 这道题目是一道模拟题,但是它有一点贪心的思想. 我们假设当前最大的深度是 \(d\) ,那么我们需要把 ...
- P1016 旅行家的预算——贪心
P1016 旅行家的预算 贪心求,在当前点如果能到达距离最近的油价比他小的就直接去油价比他小的, 如果在可行范围内没有比他油价小的,就加满开到可行范围内油价最小的点: 这么做是对的,我不会证明: 还有 ...
- [luogu]P1016 旅行家的预算[贪心]
[luogu]P1016 旅行家的预算 题目描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能 ...
- 洛谷 P2503 [HAOI2006]均分数据 随机化贪心
洛谷P2503 [HAOI2006]均分数据(随机化贪心) 现在来看这个题就是水题,但模拟赛时想了1个小时贪心,推了一堆结论,最后发现贪心做 不了, 又想了半个小时dp 发现dp好像也做不了,在随机化 ...
随机推荐
- WildFly配置gzip压缩
使用jboss-cli.sh 执行下面的脚本 /subsystem=undertow/configuration=filter/gzip=gzipFilter:add() /subsystem=und ...
- Leetcode959. Regions Cut By Slashes由斜杠划分区域
在由 1 x 1 方格组成的 N x N 网格 grid 中,每个 1 x 1 方块由 /.\ 或空格构成.这些字符会将方块划分为一些共边的区域. (请注意,反斜杠字符是转义的,因此 \ 用 &quo ...
- Python-爬虫实战 简单爬取豆瓣top250电影保存到本地
爬虫原理 发送数据 获取数据 解析数据 保存数据 requests请求库 res = requests.get(url="目标网站地址") 获取二进制流方法:res.content ...
- vue.js_03_vue.js的样式和修饰符
1.vue.js的样式 <body> <div id="app"> <h1 :style="styleObj1">这是一个h ...
- 原生 js 实现摇一摇功能
参考此大牛的博客:https://blog.csdn.net/chclvzxx/article/details/46325053
- sort方法
作用:对列表进行排序 >>> spam=[2,5,3,14,1,-7] >>> spam.sort() >>> spam [-7, 1, 2, 3 ...
- hbase 聚合操作
hbase本身提供了 聚合方法可以服务端聚合操作 hbase中的CoprocessorProtocol机制. CoprocessorProtocol的原理比较简单,近似于一个mapreduce框架.由 ...
- Opencv中RGB通道/HSV通道并分离
OpenCV中HSV颜色模型及颜色分量范围 opencv HSV 颜色模型(H通道取值 && CV_BGR2HSV_FULL) [opencv]在hsv颜色空间识别区域颜色 将原图分离 ...
- JNI初级:android studio生成so文件详细过程
本文主要参考blog:http://blog.csdn.net/jkan2001/article/details/54316375 下面是本人结合blog生成so包过程中遇到一些问题和解决方法 (1) ...
- php+js实现百度地图多点标注的方法
本文实例讲述了php+js实现百度地图多点标注的方法.分享给大家供大家参考,具体如下: 1.php创建json数据 ? 1 2 $products = $this->product_db-> ...