P1016 旅行家的预算
P1016 旅行家的预算
题目描述
一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离D1、汽车油箱的容量C(以升为单位)、每升汽油能行驶的距离D2、出发点每升汽油价格P和沿途油站数N(N可以为零),油站i离出发点的距离Di、每升汽油价格Pi(i=1,2,…,N)。计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出“No Solution”。
输入输出格式
输入格式:
第一行,D1,C,D2,P,N。
接下来有N行。
第i+1行,两个数字,油站i离出发点的距离Di和每升汽油价格Pi。
输出格式:
所需最小费用,计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出“No Solution”。
输入输出样例
275.6 11.9 27.4 2.8 2
102.0 2.9
220.0 2.2
26.95
分析:在能到达的加油站中内寻找最便宜的加油站,然后判断是否能一次到达,不能的话先加满,然后一个一个判断直到剩下的油量不足到下一个加油站就加油,不用加满。
remain是当前剩余的油,cost花费,pos目标站
所有有两种情况:
1.当前站就是pos 再细分两种情况:
1.从pos就可以走到终点,于是我们把油加到刚好到达终点即可
cost += ((d[i] - d[pos]) / d2 - remain)*p[pos];就得到了最后答案。
2.从pos不能一把走到终点于是,从当前位置走,走到哪里加油都不如在pos这里加油划算。所以加满。
2.当前站点是在pos后面的某个站点,也有两种情况
1.当前剩余的油remain不够走到此站,所以我们把油加来刚好能够走到此站就行了。(因为这里便宜!)
2.剩余的油remain足够,直接开过去就行了。
#include<cstdio>
int n;
double d1,d2,c;
double remain=,cost=;
double p[],d[];
int main()
{
scanf("%lf%lf%lf%lf%d",&d1,&c,&d2,&p[],&n);
for(int i=;i<=n;++i)
{
scanf("%lf%lf",&d[i],&p[i]);
}
d[n+] = d1;
int pos = ;
do{
bool flag = false; //判断能不能到达
for (int i=pos+;i<=n+&&d[i]<=d[pos]+c*d2;i++) //判断加满油能不能到达下一个加油站
{
if(p[i]<p[pos]) //找更便宜的加油站
{
if(d[pos]+remain*d2>=d[i]) //如果剩余的油足够,就开过去
{
remain -= (d[i]-d[pos])/d2;//油量将减少从一个站点到下一个站点用到的油
}
else //如果剩余的油不够
{
cost+=((d[i]-d[pos])/d2-remain)*p[pos]; //还需要加的油花费的价钱,不用加满
remain = ; //到达下一个站点时没油了,所以剩余汽油量清0
}
pos = i;
flag = true;
break;
}
}
if(!flag)
{
cost += (c-remain)*p[pos]; //不能到达前花费了多少钱
remain = c-(d[pos+]-d[pos])/d2; //还剩多少油
if (remain>=) pos++; //小于0,油根本不够到达下一个站点,大于0,代表可以去下一个加油站
else
{
printf("No Solution");
return ;
}
}
}
while(pos<=n);
printf("%.2lf",cost);
return ;
}
P1016 旅行家的预算的更多相关文章
- 洛谷 P1016 旅行家的预算
P1016 旅行家的预算 题目OJ链接https://www.luogu.org/problemnew/show/P1016 题目描述一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时 ...
- P1016 旅行家的预算——贪心
P1016 旅行家的预算 贪心求,在当前点如果能到达距离最近的油价比他小的就直接去油价比他小的, 如果在可行范围内没有比他油价小的,就加满开到可行范围内油价最小的点: 这么做是对的,我不会证明: 还有 ...
- [luogu]P1016 旅行家的预算[贪心]
[luogu]P1016 旅行家的预算 题目描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能 ...
- 洛谷 P1016 旅行家的预算 模拟+贪心
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 总结 题面 题目链接 P1016 旅行家的预算 题目描述 一个旅行家想驾驶汽车 ...
- luogu P1016 旅行家的预算
题目描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2.出发点每升汽油价格P和沿 ...
- 洛谷P1016 旅行家的预算
题目描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2.出发点每升汽油价格P和沿 ...
- [NOIP1999] 提高组 洛谷P1016 旅行家的预算
题目描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2.出发点每升汽油价格P和沿 ...
- 洛谷P1016 旅行家的预算 题解
主要就是注意一下各个变量的类型别弄混了 https://www.luogu.org/problem/P1016 #include<cstdio> using namespace std; ...
- 题解 P1016 旅行家的预算
题目传送门(以纪念调了两个半小时的单调队列) emmm这题单调队列可海星... 因为每个点有油量无限的,但是油箱容量是无限的(正好反的一道题 SP348 EXPEDI - Expedition) 所以 ...
随机推荐
- 通过一个实际例子理解Kubernetes里pod的自动scale - 水平自动伸缩
kubectl scale命令用于程序在负载加重或缩小时进行pod扩容或缩小,我们通过一些实际例子来观察scale命令到底能达到什么效果. 命令行创建一个deployment: kubectl run ...
- chpasswd
功能说明:从标准输入中读取一定格式的用户名.密码来批量更新用户的密码,其格式为 “用户名:密码”. 参数选项:-e 默认格式是明文密码,使用-e参数则需要加密的密码.
- Python map/reduce/filter/sorted函数以及匿名函数
1. map() 函数的功能: map(f, [x1,x2,x3]) = [f(x1), f(x2), f(x3)] def f(x): return x*x a = map(f, [1, 2, 3, ...
- 【HHHOJ】ZJOI2019模拟赛(十六)4.07 解题报告
点此进入比赛 得分: \(100+100+100=300\) 排名: \(Rank\ 1\) \(Rating\): \(+13\)(\(\frac18Rated\)) 备注: 这场比赛全是做过的原题 ...
- 作为PHP开发者请务必了解Composer
Composer是一个非常流行的PHP包依赖管理工具,已经取代PEAR包管理器,对于PHP开发者来说掌握Composer是必须的. 对于使用者来说Composer非常的简单,通过简单的一条命令将需要的 ...
- Linq 集合比较
List<RemindTbl> l_lstRemind = (from x in RemindTbl where (from y in RemindTblOld where x.Atten ...
- Windows下安装PCL点云库
原文链接:http://blog.csdn.net/u012337034/article/details/38270109 简介: 在Windows下安装PCL点云库的方法大概有两种: ...
- 火狐 SSL 收到了一个弱临时 Diffie-Hellman 密钥
火狐 SSL 收到了一个弱临时 Diffie-Hellman 密钥 最近在用FireFox 调试时使用Https,连接 https网址 时发生错误. 在服务器密钥交换握手信息中 SSL 收到了一个 ...
- Viewpager实现今日头条顶部导航的功能
利用简单的Textview 和Viewpager实现滑动.点击换页的效果,效果图如下: 先上布局文件代码: <?xml version="1.0" encoding=&quo ...
- Unity 游戏框架搭建 (十一) 简易AssetBundle打包工具(一)
最近在看Unity官方的AssetBundle(以下简称AB)的教程,也照着做了一遍,不过做出来的AssetBundleManager的API设计得有些不太习惯.目前想到了一个可行的解决方案.AB相关 ...