题目描述

Farmer John has decided to take a cross-country vacation. Not wanting his cows to feel left out, however, he has decided to rent a large truck and to bring the cows with him as well!

The truck has a large tank that can hold up to G units of fuel (1 <= G <= 1,000,000). Unfortunately, it gets very poor mileage: it consumes one unit of fuel for every unit of distance traveled, and FJ has a total of D units of distance to travel along his route (1 <= D <= 1,000,000,000).

Since FJ knows he will probably need to stop to refill his tank several times along his trip, he makes a list of all the N fuel stations along his route (1 <= N <= 50,000). For each station i, he records its distance X_i from the start of the route (0 <= X_i <= D), as well as the price Y_i per unit of fuel it sells (1 <= Y_i <= 1,000,000).

Given this information, and the fact that FJ starts his journey with exactly B units of fuel (0 <= B <= D), please determine the minimum amount of money FJ will need to pay for fuel in order to reach his destination. If it is impossible for him to reach the destination, please output -1. Note that the answer to this problem may not fit into a standard 32-bit integer.

Farmer Jhon 决定去一次跨国旅游度假。为了不让他的奶牛们感到被抛弃,他决定租一辆大卡车来带他的奶牛们一起旅行。

这辆卡车有一个很大的油箱,可以装下G个单位的油(1 <= G <= 1,000,000), 不幸的是,卡车的耗油量也很大,卡车每运动一个单位的距离,就要消耗一个单位的油。Farmer Jhon 要在他的旅程中走D个单位的距离。(1 <= D <= 1,000,000,000)

因为FJ直到他可能要几次在旅途中停下,给油箱加油,所以他把在旅途沿路上的N个加油站的记录做成了表格。对于第i个加油站,他记录了加油站与起点的距离X_i(0 <= X_i <= D),以及加油站中每单位油的价格Y_i(1 <= Y_i <= 1,000,000)。

已知以上所给的信息,以及FJ在路途中实际使用的油的数量B(0 <= B <= D),请计算出FJ到达目的地时花费的油费用的最小值。如果FJ无法到达旅途的终点,那么轻输出-1。本题的答案可能无法使用32位整数储存。

输入输出格式

输入格式:

第1行: 四个整数: N,G,B,D

第2~1+N行: 每一行都有两个整数X_i与Y_i,意义如上所述

输出格式:

一个整数,如果FJ无法到达旅途的终点,那么输出-1,否则输出FJ到达目的地时花费的油费用的最小值。

输入输出样例

输入样例#1:

4 10 3 17
2 40
9 15
5 7
10 12
输出样例#1:

174

说明

样例解释:FJ先移动2个单位,然后停下购买2个单位的油(要花费40 x 20)。然后一直前进到距离起点5个单位的地方,此时油箱为空。这时向油箱里加满油(要花费7 x 10)。再向前走5个单位,加2个单位的油(花费12 x 2)。最后一直走到终点。此时总花费是174.

思路:贪心。首先对各个加油站的坐标从小到大排序,然后进行贪心求解。

  1.找在能力范围之内所能到达的比当前加油站的油价小的第一个加油站。如果没有就找当前能力范围内油价最小的加油站。

  2.跳到上一步找到的加油站。

  3.如果在加满油后,所能到达的加油站的油价有比当前便宜的,那么只要加满足够到达那个加油站的油。

  4.反之,就加满油。

错因:

  1.思路错误:一开始是对价格排的序,找到当前加油站后面所能到达的加油站中油价最小的加油站然后跳过去。但是这样的贪心是不正确的,eg:100 10 1 对这个例子我会从100跳到1花费200,但是如果从100跳到10再跳到1就只花费110。

  2.漏下了flag1。

  3.判断力所能及的加油站范围判断错误。

  4.再3步时,没有考虑不用加油的情况。出现了负数。

吐槽:来给大家看一下提交记录QwQ

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 50002
using namespace std;
long long N,G,B,D;
long long ans,now,lost,pos;
struct nond{
long long x,y;
}v[MAXN];
int cmp(nond a,nond b){
return a.x<b.x;
}
int main(){
cin>>N>>G>>B>>D;
for(int i=;i<=N;i++)
cin>>v[i].x>>v[i].y;
v[].x=;v[].y=0x7f7f7f7f;
v[N+].x=D;v[N+].y=;
sort(v+,v++N,cmp);
if(v[].x-v[].x>B){
cout<<"-1";
return ;
}
for(int i=;i<=N+;i++)
if(v[i].x-v[i-].x>G){
cout<<"-1";
return ;
}
lost=B;now=;pos=;
while(now!=D){
int num=pos+;
bool flag=,flag1=;;
for(int i=pos+;i<=N+;i++)
if(v[i].y<v[pos].y&&v[i].x-now<=lost){
num=i;
flag1=;
break;
}
if(!flag1)
for(int i=pos+;i<=N+;i++)
if(v[i].y<=v[num].y&&v[i].x-now<=lost)
num=i;
lost-=v[num].x-now;
now=v[num].x;
pos=num;
for(int i=pos+;i<=N+;i++)
if(v[i].y<v[pos].y&&v[i].x-now<=G){
if(v[i].x-now-lost<=)
ans=ans;
else{
ans+=(v[i].x-now-lost)*v[pos].y;
lost+=v[i].x-now-lost;
}
flag=;
break;
}else if(v[i].x-now>G) break;
if(!flag){
ans+=(G-lost)*v[pos].y;
lost=G;
}
}
cout<<ans;
}

洛谷 P2209 [USACO13OPEN]燃油经济性Fuel Economy的更多相关文章

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

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

  2. [luogu2209][USACO13]燃油经济性Fuel Economy_贪心

    燃油经济性Fuel Economy 题目大意:FJ想要去旅行.他的车总容量为G,每行驶一个单位就消耗一个单位的油.FJ要行驶D个单位的距离.期间存在n个加油站,每个加油站有一个价格,表示在这个燃油站买 ...

  3. 洛谷P3085 [USACO13OPEN]阴和阳Yin and Yang(点分治,树上差分)

    洛谷题目传送门 闲话 偶然翻到一道没有题解的淀粉质,想证明一下自己是真的弱 然而ZSYC(字符串组合)早就切了 然后证明成功了,WA到怀疑人生,只好借着ZSY的代码拍,拍了几万组就出来了... 思路 ...

  4. 洛谷 P3084 [USACO13OPEN]照片Photo 解题报告

    [USACO13OPEN]照片Photo 题目描述 农夫约翰决定给站在一条线上的\(N(1 \le N \le 200,000)\)头奶牛制作一张全家福照片,\(N\)头奶牛编号\(1\)到\(N\) ...

  5. 洛谷3084 [USACO13OPEN]照片Photo

    原题链接 神仙\(DP\)啊... 题解请移步隔壁大佬的博客\(QAQ\) #include<cstdio> using namespace std; const int N = 2e5 ...

  6. 洛谷P3084 [USACO13OPEN]照片

    题目 \(DP\) 设状态\(dp[i]\)为\(i\)位置放了斑点牛,前\(i\)个位置能得到的最多的牛. 有方程\(dp[i]=max(dp[j]+1,dp[i])\),而我们并不知道什么\(j\ ...

  7. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  8. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  9. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

随机推荐

  1. POJ 3370 Halloween treats( 鸽巢原理简单题 )

    链接:传送门 题意:万圣节到了,有 c 个小朋友向 n 个住户要糖果,根据以往的经验,第i个住户会给他们a[ i ]颗糖果,但是为了和谐起见,小朋友们决定要来的糖果要能平分,所以他们只会选择一部分住户 ...

  2. Python 3 实现数字转换成Excel列名(10进制到26进制的转换函数)

    背景: 最近在看一些Python爬虫的相关知识,讲爬取的一些数据写入到Excel表中,当时当列的数目不确定的情况下,如何通过遍历的方式讲爬取的数据写入到Excel中. 开发环境: Python 3  ...

  3. url中jsessionid的理解

    (1) 这是一个保险措施 因为Session默认是需要Cookie支持的 但有些客户浏览器是关闭Cookie的 这个时候就需要在URL中指定服务器上的session标识,也就是5F4771183629 ...

  4. Qt之设置应用程序图标

    简述 应用程序图标,通常显示在应用程序的顶层窗口的左上角,通过调用QWindow:setWindowIcon()函数来实现. 为了改变可执行程序文件本身的图标,因为它被呈现在桌面上,它必须采用另一种依 ...

  5. POJ 3744

    矩阵快速乘求概率,不难.但有注意的一点是,一定要注意地雷连着的情况,一旦出现两个雷相邻,就必定为0了. #include <iostream> #include <algorithm ...

  6. Swift的构造和析构过程

    构造过程 Swift的构造过程通过定义构造器来实现. 只是与Objective-C不同的是,Swift的构造器不须要返回值,相同也不须要表明Func. 另外值得提的是,当构造器中为存储型属性赋值时.不 ...

  7. HDU 1040.As Easy As A+B【排序】【如题(水!水!水!)】【8月24】

    As Easy As A+B Problem Description These days, I am thinking about a question, how can I get a probl ...

  8. Ubuntu 16.04 安装 Open Jdk

    sudo add-apt-repository ppa:openjdk-r/ppa sudo apt-get update sudo apt-get install openjdk-7-jdk

  9. 51nod-1346: 递归

    [传送门:51nod-1346] 简要题意: 给出一个式子a[i][j]=a[i-1][j]^a[i][j-1] 给出a[1][i],a[i][1](2<=i<=131172) 有n个询问 ...

  10. chrome控制台常用技巧有哪些

    chrome控制台常用技巧有哪些 一.总结 一句话总结:别的里面支持的快捷键,chrome里面几乎都支持,比如sublime中的ctrl+d,其实真是一通百通,都差不多的 1.chrome如何快速切换 ...