洛谷 P2209 [USACO13OPEN]燃油经济性Fuel Economy
题目描述
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到达目的地时花费的油费用的最小值。
输入输出样例
4 10 3 17
2 40
9 15
5 7
10 12
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的更多相关文章
- P2209 [USACO13OPEN]燃油经济性Fuel Economy
题面 sol:(思想):开一个大根堆和一个小根堆,每次计算到下了一个加油站用掉的油时尽量用小根堆中的元素,且同时删去大根堆中的相应位置的元素,当前加油站如果足够便宜,就可以把大根堆中的元素替换掉: ( ...
- [luogu2209][USACO13]燃油经济性Fuel Economy_贪心
燃油经济性Fuel Economy 题目大意:FJ想要去旅行.他的车总容量为G,每行驶一个单位就消耗一个单位的油.FJ要行驶D个单位的距离.期间存在n个加油站,每个加油站有一个价格,表示在这个燃油站买 ...
- 洛谷P3085 [USACO13OPEN]阴和阳Yin and Yang(点分治,树上差分)
洛谷题目传送门 闲话 偶然翻到一道没有题解的淀粉质,想证明一下自己是真的弱 然而ZSYC(字符串组合)早就切了 然后证明成功了,WA到怀疑人生,只好借着ZSY的代码拍,拍了几万组就出来了... 思路 ...
- 洛谷 P3084 [USACO13OPEN]照片Photo 解题报告
[USACO13OPEN]照片Photo 题目描述 农夫约翰决定给站在一条线上的\(N(1 \le N \le 200,000)\)头奶牛制作一张全家福照片,\(N\)头奶牛编号\(1\)到\(N\) ...
- 洛谷3084 [USACO13OPEN]照片Photo
原题链接 神仙\(DP\)啊... 题解请移步隔壁大佬的博客\(QAQ\) #include<cstdio> using namespace std; const int N = 2e5 ...
- 洛谷P3084 [USACO13OPEN]照片
题目 \(DP\) 设状态\(dp[i]\)为\(i\)位置放了斑点牛,前\(i\)个位置能得到的最多的牛. 有方程\(dp[i]=max(dp[j]+1,dp[i])\),而我们并不知道什么\(j\ ...
- 洛谷1640 bzoj1854游戏 匈牙利就是又短又快
bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...
- 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.
没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...
- 洛谷P1108 低价购买[DP | LIS方案数]
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
随机推荐
- BZOJ 2314 士兵的放置(支配集)
显然是\(DP\). 设\(dp[i][0/1/2]\)代表以i为根且\(i上有士兵放置/i被控制但i上没有士兵/i没有被控制\)的最小代价. \(g[i][0/1/2]\)代表对应的方案数. 然后运 ...
- 三、Git 分支
使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线.有人把 Git 的分支模型称为它的`‘必杀技特性’',也正因为这一特性,使得 Git 从众多版本控制系统中脱颖而出. 1.分支简介 ...
- Layui Excle/csv数据导出
官方文档的数据是这样的 依赖 Layui 2.4版本以上 layui.use([ 'table'], function(){ var table=layui.table; table.exportFi ...
- jquery 用于操作动态元素的delegate/on方法
delegate() 方法的事件处理程序适用于当前或未来的元素(比如由脚本创建的新元素). 在做项目中有很多由ajax动态生成的html标签,jquery对这些标签不会响应\((selector).c ...
- Python-基础-day6
1.二进制 前言:计算机一共就能做两件事:计算和通信 2.字符编码 生活中的数字要想让计算机理解就必须转换成二进制.十进制到二进制的转换只能解决计算机理解数字的问题,那么文字要怎么让计算机理解呢? 于 ...
- RabbitMQ学习总结(6)——消息的路由分发机制详解
一.Routing(路由) (using the Java client) 在前面的学习中,构建了一个简单的日志记录系统,能够广播所有的日志给多个接收者,在该部分学习中,将添加一个新的特点,就是可以只 ...
- C#-基础部分思维导图
C#-基础部分思维导图 链接:http://pan.baidu.com/s/1jHNgS78 密码:3i74 如果有错我,请告诉我,传播错误的知识是违法的.
- POJ 2447
挺水的一题.其实只要理解了RSA算法,就知道要使用大整数分解的方法来直接模拟了. 不过,要注意两个INT64的数相乘来超范围 #include <iostream> #include &l ...
- 每天学点Python之comprehensions
每天学点Python之comprehensions 推导式能够简化对数据的处理,让代码简洁的同一时候还具有非常高的可读性.这在Python中非经常见. 列表推导式 通过列表推导式能够对列表中的全部元素 ...
- Tachyon在Spark中的作用(Tachyon: Reliable, Memory Speed Storage for Cluster Computing Frameworks 论文阅读翻译)
摘要: Tachyon是一种分布式文件系统,能够借助集群计算框架使得数据以内存的速度进行共享.当今的缓存技术优化了read过程,可是,write过程由于须要容错机制,就须要通过网络或者 ...