题目描述

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. [转载] C 陷阱与缺陷( C traps and Pitfalls )

    本文转自 https://www.xuebuyuan.com/1951579.html 自己找工作过程中复习过的书包括<C traps and Pitfalls>,<编程珠玑> ...

  2. vuex中mutations与actions的区别

    要执行vuex中的函数,有两种方法: 1.commit,例如this.$store.commit("GETMODULESELECTLIST"); //mutations中的方法 2 ...

  3. SQL的运算符优先级

    注: 1.乘除的优先级高于加减: 2.同一优先级运算符从左向右执行: 3.括号内的运算先执行.

  4. 玩转iOS开发 - Runloop 具体解释

    Runloop 具体解释

  5. ACM-ICPC Dhaka Regional 2012 题解

    B: Uva: 12582 - Wedding of Sultan 给定一个字符串(仅由大写字母构成)一个字母表示一个地点,经过这个点或离开这个点都输出这个地点的字母) 问: 每一个地点经过的次数(维 ...

  6. cocos2d-x3.2 下使用多线程

    事实上在cocos2dx下使用多线程事实上就是用C++去写,这里提供几个简单的样例: 原文地址:http://blog.csdn.net/qqmcy/article/details/36227377 ...

  7. sql server2008对字符串日期字段分区

    近期对公司产品的日志数据库做了一个数据分区,数据库使用的是sql server 2008,这里给大家提供一个參考. 须要特别说明的是,非常多网上的样例分区字段都使用的是时间类型的.而这里因为时间字段原 ...

  8. ksh简介

    -- Start 什么是 Shell 如果把 Linux 比作一个蛋,那么 Shell 就是蛋壳,我们需要通过 Shell 来使用系统. Shell 的种类 最早的 Shell 是 Bourne Sh ...

  9. 12:Challenge 5(线段树区间直接修改)

    总时间限制:  10000ms 单个测试点时间限制:  1000ms 内存限制:  262144kB 描述 给一个长为N的数列,有M次操作,每次操作是以下两种之一: (1)将某连续一段同时改成一个数 ...

  10. MyBatis数据持久化(四)类型别名

    Mybatis的类型别名指的是我们可以为Java类型自定义一个简短的名字,以达到简化配置的目的,在上篇博文中我们的sql语句配置文件内容如下: <?xml version="1.0&q ...