燃油经济性Fuel Economy

题目大意:FJ想要去旅行。他的车总容量为G,每行驶一个单位就消耗一个单位的油。FJ要行驶D个单位的距离。期间存在n个加油站,每个加油站有一个价格,表示在这个燃油站买一个单位的油的价格val;还有一个距离d,表示这个燃油站距离FJ起点的距离。FJ起始有B个单位的油。请输出FJ到达终点的最小花费,如果FJ无法到达终点请输出-1。

注释:$1\le G\le10^6$,$1\le D \le 10^9$,$1\le N\le 5\cdot 10^4$,$0\le d\le D$,$1\le val\le 10^6$。

想法:dp了半天,什么旅行家的预算乱七八糟的... ...正解是贪心,还挺巧妙的。(先把无解的判掉,即如果两个加油站之间的距离大于D就无解了)

  首先,考虑FJ在第x个加油站。如果从$d_x$开始后面的D个单位中存在的第一个加油站y使得$val_y<val_x$,那么就恰好将FJ的油加到能到y,然后到y。为什么是对的?首先如果FJ后面有2个加油站y和z使得$val_y>val_z$但$d_x < d_y < d_z$。这时,如果我们令FJ直接到达了z,如果当前油量够,那么无论是直接到达z还是先到y再到z,最后是一样的;如果当前油量不够,如果直接到z就需要在x加油站补上z到x之间的油量差,如果先到y再到z只需要在x补上y到x的油量差然后剩下的在y号加油站购买,这样显然是比直接到z更优的。

  其次,如果从$d_x$开始的D个单位中的所有加油站都比$val_x$大,那么我们就直接到后面D个单位中最小的那个。证明是类似的:假设val最小的加油站是z,z和x中间有一个加油站y满足$d_x<d_y<d_z$且$val_x<val_z<val_y$。如果直接到z,需要在x补上z和x之间的油量差。如果先到达了y,那么根据我们的贪心策略,现在x补上y与x之间的油量差,剩下的z与y之间的油量差在y上补。因为$val_x<val_y$,所以这样一定是更优的。

  这样我们就证明了贪心策略的正确性,证毕。

最后,附上丑陋的代码... ...

#include <iostream>
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
#define N 50005
typedef long long LL;
int n,G,B,D;
struct node
{
int d,p;
}e[N];
int dis[N],price[N-2];
int dispose(int s,int lim)
{
int now=s+1,to=N;
while(now<=n)
{
if(dis[now]-dis[s]>lim) return to;
if(price[now]<price[s]) return now;
if(price[now]<price[to]) to=now;
now++;
}
return to;
}
bool cmp(node a,node b)
{
return a.d<b.d;
}
int main()
{
scanf("%d%d%d%d",&n,&G,&B,&D);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&e[i].d,&e[i].p);
}
sort(e+1,e+n+1,cmp);
for(int i=1;i<=n;i++)
{
dis[i]=e[i].d; price[i]=e[i].p;
if(dis[i]-dis[i-1]>G)
{
printf("-1");
return 0;
}
}
if(dis[1]>B || D-dis[n]>G)
{
printf("-1");
return 0;
}
price[N-2]=2e9;
int now=0,to;
to=dispose(now,B);
now=to;
int nowB=B-dis[to];
LL ans=0;
if(dis[n]==D) price[n]=0;
else
{
n++; dis[n]=D; price[n]=0;
}
while(now<n)
{
to=dispose(now,G);
if(price[to]>price[now])
{
ans+=1ll*(G-nowB)*price[now];
nowB=G-dis[to]+dis[now];
}
else
{
ans+=1ll*(dis[to]-dis[now]-nowB)*price[now];
nowB=0;
}
now=to;
}
printf("%lld",ans);
return 0;
}

    小结:此题的贪心是好想且巧妙的。

[luogu2209][USACO13]燃油经济性Fuel Economy_贪心的更多相关文章

  1. 洛谷 P2209 [USACO13OPEN]燃油经济性Fuel Economy

    P2209 [USACO13OPEN]燃油经济性Fuel Economy 题目描述 Farmer John has decided to take a cross-country vacation. ...

  2. P2209 [USACO13OPEN]燃油经济性Fuel Economy

    题面 sol:(思想):开一个大根堆和一个小根堆,每次计算到下了一个加油站用掉的油时尽量用小根堆中的元素,且同时删去大根堆中的相应位置的元素,当前加油站如果足够便宜,就可以把大根堆中的元素替换掉: ( ...

  3. SAP成都研究院飞机哥:程序猿和飞机的不解之缘

    今天的文章来自Jerry的老同事张航. 张航和Jerry一样于2007年毕业后加入SAP成都研究院工作至今.进入SAP后的第一个开发部门是SAP Business by Design Infrastr ...

  4. Mentor.Graphics.FloTHERM.XT.2.3+Mentor.Graphics.Flowmaster.7.9.4

    Mentor.Graphics.FloTHERM.XT.2.3 Mentor.Graphics.Flowmaster.7.9.4 AVL.CRUISE.V2015.0-车辆动力学仿真分析平台 AVL. ...

  5. ggplot2(3) 语法突破

    3.1 简介 图形图层语法基于Wilkinson的图形语法,并在其基础上添加了许多新功能,使得图形更有表现力,并能完美地嵌入到R的环境中. 图形图层语法使得图形的重复更新变得简单——每次只更新一个特征 ...

  6. [Python] Matplotlib 图表的绘制和美化技巧

    目录 在一张画布中绘制多个图表 加图表元素 气泡图 组合图 直方图 雷达图 树状图 箱形图 玫瑰图 在一张画布中绘制多个图表 Matplotlib模块在绘制图表时,默认先建立一张画布,然后在画布中显示 ...

  7. 送你一个Python 数据排序的好方法

    摘要:学习 Pandas排序方法是开始或练习使用 Python进行基本数据分析的好方法.最常见的数据分析是使用电子表格.SQL或pandas 完成的.使用 Pandas 的一大优点是它可以处理大量数据 ...

  8. MATLAB R2019b超详细安装教程(附完整安装文件)

    摘要:本文详细介绍Matlab的安装步骤,为方便安装这里提供了完整安装文件的百度网盘下载链接供大家使用.从文件下载到证书安装本文都给出了每个步骤的截图,按照图示进行即可轻松完成安装使用.本文目录如首页 ...

  9. ECON 模式

    ECON模式通过调节发动机和空调系统的性能,有效提高燃油经济性. 在D行驶档的时候开启

随机推荐

  1. etcd磁盘清理步骤

    etcd默认的空间配额限制为2G,超出空间配额限制就会影响服务,所以需要定期清理 以下是etcd磁盘清理的步骤: 1. 显示空间配额: ETCDCTL_API=3 etcdctl --endpoint ...

  2. E20170619-hm

    bucket   n. 水桶; open hash  [词典] [计] 开放散列,开混列; spirit   n. 精神,心灵; 情绪; 勇气; 精髓; flesh   n. 肉; 肉体; 果肉; 皮 ...

  3. eclipse的快捷键---调试

    1:查看类或接口的方法 Ctrl+T 2:debug调试查看信息 Ctrl+Shift+i 3:debug调试快捷键 (1):F11好像是重新运行debug. (2):F8直接输出结果.(3):F5单 ...

  4. [App Store Connect帮助]三、管理 App 和版本(5)添加平台以创建通用购买

    您可以为 App 添加一个平台以创建通用购买.例如,为现有的 iOS App 添加相关的 Apple TVOS App,从而将该 Apple TVOS App 和 iOS App 一同出售. 与创建新 ...

  5. [Swift通天遁地]五、高级扩展-(6)对基本类型:Int、String、Array、Dictionary、Date的扩展

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  6. Dockerfile镜像的制作

    Dockerfile镜像的制作 如果学习Docker,那么制作镜像这一步肯定不能少的,别人给你的是环境,而你自己做的才是你最终需要的东西,接下来就记录一下如何制作一个满足自己的镜像,我们使用docke ...

  7. sql 全站搜索

    SQL全站搜索 create proc Full_Search(@string varchar(50)) as begin declare @tbname varchar(50) declare tb ...

  8. skiing 暴力搜索 + 动态规划

    我的代码上去就是 直接纯粹的  暴力  .   居然没有超时   200ms  可能数据比较小   一会在优化 #include<stdio.h> #include<string.h ...

  9. 题解报告:hdu 1213 How Many Tables

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1213 Problem Description Today is Ignatius' birthday. ...

  10. java定时器和实时查询数据库

    定时器: Timer timer = new Timer();                    timer.schedule(new TimerTask() {                  ...