题面

题目链接

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.要自己动手模拟

最新文章

  1. yii2获取登录前的页面url地址--电脑和微信浏览器上的实现以及yii2相关源码的学习
  2. Testing - 测试基础 - 阶段
  3. code vs 1026 逃跑的拉尔夫
  4. java微信开发(wechat4j)——wechat4j配置文件解读
  5. PHP使用mail()函数发送邮件流程以及注意事项
  6. ECSHOP报错误Deprecated: preg_replace(): The /e modifier is depr
  7. 香港house of hello品牌包包是怎样被模仿呢?
  8. OD: Heap in Windows 2K &amp; XP SP1
  9. 传智播客C/C++学员荣膺微软&amp;Cocos 2d-x黑客松最佳创新奖
  10. Oracle EBS 如何月结[Z]
  11. 锁和监视器之间的区别 – Java并发
  12. Loadrunner 网页诊断图
  13. linux下stricky
  14. [Swift]LeetCode837. 新21点 | New 21 Game
  15. [转] fastText
  16. SQL 查找存在某内容的存储过程都有哪些
  17. redis相关运维命令
  18. k8s初始化搭建方法
  19. Django学习手册 - 登录验证码
  20. 多版本opencv管理; find_package()的原理解析

热门文章

  1. IQueryable与IEnumerable使用区别
  2. 实战课堂 | MongoDB如何使用内存?内存满了怎么破?
  3. HZOI20190814 B 不等式
  4. git简单使用命令
  5. SQL Server数据库存储过程的异常处理
  6. Life of Pi
  7. compareTo)--list 根据某字段排序
  8. MapReduce:详解Shuffle(copy,sort,merge)过程(转)
  9. Tomcat服务器的安装及配置
  10. ubuntn16.04指令