HDU5380 Travel with candy
来源:互联网 发布:高数搜题软件 编辑:程序博客网 时间:2024/05/21 20:23
思路:
1、保持油箱的油一直是满的。
2、到达每个城市之后,先将到达这个城市的花费减掉,这些消耗掉的应该是价格最低的。
3、对于油箱中的油的价格如果比当前城市买入的价格更高的话就直接退出油箱(退出油箱的意思:直接以购买的价格卖出 (这里的购买价格是会改变的) ),对于油箱中的油如果价格比当前城市卖出的价格低的话,那么可以将这些油的价格改成当前城市卖出的价格(可以想象成在当前城市卖出这些油,然后以卖出的价格买回来这部分油)。
4、然后在这个城市买油加满油箱。
这些操作可以用一个双端队列来维护。
#include <cstring>#include <algorithm>#include <cstdio>#include <cmath>#include <iostream>#include <queue>#define mp make_pair#define INF 1000000000#define MAXN 200050#define max(x,y) ((x)>(y)?(x):(y))#define min(x,y) ((x)<(y)?(x):(y))#define P pair<int,int>#define LL long longusing namespace std;int a[MAXN];LL buy[MAXN],sell[MAXN];int len[MAXN];LL now[MAXN];int q[MAXN];void work(){ int st=0,ed=0; int n,c; scanf("%d%d",&n,&c); for(int i=1;i<=n;++i)scanf("%d",&a[i]); for(int i=0;i<=n;++i)scanf("%I64d%I64d",&buy[i],&sell[i]); now[0]=c; q[ed++]=0; LL ans=c*buy[0]; for(int i=1;i<=n;++i){ //扣掉到达这个城市的消耗 int dis=a[i]-a[i-1]; LL sum=c-dis; while(dis){ int x=q[st]; if(now[x]>dis){ now[x]-=dis; dis=0; }else{ dis-=now[x]; now[x]=0; st++; } } //如果油箱中的油的价格小于当前城市的卖出价格,那么这些油的价格会等于当前城市的卖出价格,可以想象成在这个城市全部卖出,然后再原价买回来。 int era=0; while(st<ed){ int x=q[st]; if(buy[x]<sell[i]){ era+=now[x]; st++; }else break; } if(era!=0){ st--; now[q[st]]=era; buy[q[st]]=sell[i]; } //对于油箱中价格比当前城市买入价格更高的油,全部直接退出油箱。以原来的价格卖掉。 bool flag=true; while(flag&&st<ed){ flag=false; int x=q[ed-1]; if(buy[x]>=buy[i]){ flag=true; ans-=now[x]*buy[x]; sum-=now[x]; now[x]=0; ed--; } } //将油箱加满。 q[ed++]=i; now[i]=c-sum; ans+=(c-sum)*buy[i]; } //将邮箱中剩余的退出。 while(st<ed){ int x=q[st++]; ans-=now[x]*buy[x]; } printf("%I64d\n",ans);}int main(){ len[0]=len[1]=0; for(int i=2;i<MAXN;++i){ int k=0; while((1<<k)<=i)k++; len[i]=k-1; } int tt; scanf("%d",&tt); while(tt--){ work(); }}
0 0
- HDU5380 Travel with candy
- HDU 5380 Travel with candy 单调队列
- hdu 5380 Travel with candy 贪心&队列
- hdu 5380 Travel with candy(双端队列)
- HDU 5380 Travel with candy (单调队列&贪心)
- hdu 5380 Travel with candy (单调队列)@
- HDU5380
- hdu 5380 Travel with candy 单调队列 2015 Multi-University Training Contest 8
- 2015多校第8场 HDU 5380 Travel with candy 贪心,单调队列
- A. Feed with Candy
- 【LeetCode with Python】 Candy
- Feed with Candy
- CF A. Feed with Candy
- codeforces A. Feed with Candy
- 5 Ways To Travel More With Less
- cf Feed with Candy 这题做的都想哭
- ZOJ 3922Candy with chocolate(几何)
- Travel
- 在 Eclipse 中使用 Maven 构建 Web 项目
- 第43讲:Scala中类型变量Bounds代码实战及其在Spark中的应用源码解析学习笔记
- 九度 Online Judge 算法 刷题 题目1083:特殊乘法
- JAVA 23 种设计模式
- jeecms学习二-------学习freeMark标签及自定义标签的用法
- HDU5380 Travel with candy
- RPC与REST的区别
- 九度 Online Judge 算法 刷题 题目1087:约数的个数
- P2P, P2C, O2O, B2C, B2B, C2C
- 动态规划
- I/O多路复用之select
- Java实现文件重命名 以及file类的其他函数讲解
- 杭州电子科技大学acm-2001
- poj(2528)——Mayor's posters(线段树+离散化)