题面

题目链接

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 旅行家的预算 模拟+贪心的更多相关文章

  1. 洛谷 P1016 旅行家的预算

    P1016 旅行家的预算 题目OJ链接https://www.luogu.org/problemnew/show/P1016 题目描述一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时 ...

  2. [NOIP1999] 提高组 洛谷P1016 旅行家的预算

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

  3. 洛谷P1016 旅行家的预算

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

  4. 洛谷P1016 旅行家的预算 题解

    主要就是注意一下各个变量的类型别弄混了 https://www.luogu.org/problem/P1016 #include<cstdio> using namespace std; ...

  5. 洛谷 P1016 旅行者的预算

    传送门 感觉自己连点生活常识都没有,竟然连油用过之后要减去都不知道,这种贪心模拟题都做不出来--思路在代码里,我菜死了 思路&&代码 //看题解过的..一点都没有成就感 #includ ...

  6. 洛谷P5019 铺设道路 题解 模拟/贪心基础题

    题目链接:https://www.luogu.org/problemnew/show/P5019 这道题目是一道模拟题,但是它有一点贪心的思想. 我们假设当前最大的深度是 \(d\) ,那么我们需要把 ...

  7. P1016 旅行家的预算——贪心

    P1016 旅行家的预算 贪心求,在当前点如果能到达距离最近的油价比他小的就直接去油价比他小的, 如果在可行范围内没有比他油价小的,就加满开到可行范围内油价最小的点: 这么做是对的,我不会证明: 还有 ...

  8. [luogu]P1016 旅行家的预算[贪心]

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

  9. 洛谷 P2503 [HAOI2006]均分数据 随机化贪心

    洛谷P2503 [HAOI2006]均分数据(随机化贪心) 现在来看这个题就是水题,但模拟赛时想了1个小时贪心,推了一堆结论,最后发现贪心做 不了, 又想了半个小时dp 发现dp好像也做不了,在随机化 ...

随机推荐

  1. LeetCode387First Unique Character in a String字符串中第一个唯一字符

    给定一个字符串,找到它的第一个不重复的字符,并返回它的索引.如果不存在,则返回 -1. 案例: s = "leetcode" 返回 0. s = "loveleetcod ...

  2. 11.Hibernate一对多关系

    创建JavaBean 一方: Customer private long cust_id; private String cust_name; private long cust_user_id; p ...

  3. parameter–key parameters

    http://www.tweakers.fr/timings.html -Cas# Latency (tCL).Number of clocks that elapses between the me ...

  4. Elasticsearch系列(二)--query、filter、aggregations

    本文基于ES6.4版本,我也是出于学习阶段,对学习内容做个记录,如果文中有错误,请指出. 实验数据: index:book type:novel mappings: { "mappings& ...

  5. LL(1),LR(0),SLR(1),LALR(1),LR(1)对比与分析

    前言:考虑到这几种文法如果把具体内容讲下来肯定篇幅太长,而且繁多的符号对初学者肯定是极不友好的,而且我相信看这篇博客的人已经对这几个文法已经有所了解了,本篇博客的内容只是对 这几个文法做一下对比,加深 ...

  6. [转]模块化——Common规范及Node模块实现(二)

    模块的循环加载 如果发生模块的循环加载,即A加载B,B又加载A,则B将加载A的不完整版本. // a.js exports.x = 'a1'; console.log('a.js ', require ...

  7. 在 Angularjs 中$state.go 如何传递参数

    在目标页面规定接受的参数: .state('app.AttendanceEditFixed', { url: '/AttendanceEditFixed', params: {'id': null,' ...

  8. php7开启强类型模式

    版权声明: https://blog.csdn.net/shi_yi_fei/article/details/52006809 我们知道php是一种弱类型的编程语言,但是php7已经有所改变,可以支持 ...

  9. 挑逗 Java 程序员的那些 Scala 绝技

    有个问题一直困扰着 Scala 社区,为什么一些 Java 开发者将 Scala 捧到了天上,认为它是来自上帝之吻的完美语言:而另外一些 Java 开发者却对它望而却步,认为它过于复杂而难以理解.同样 ...

  10. 入门servlet:request请求转发和共享数据

    request 请求转发:一种在服务器内部的资源跳转方式 步骤: 1.通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(Strin ...