HDU 5380 Travel with candy (贪心,单调队列)
题意:
有n+1个城市按顺序分布在同一直线上,现在需从0号城市按顺序走到n号城市(保证可达),从0号城市到i号城市需要消耗ai个糖果,每个城市都可以通过买/卖糖果来赚取更多的钱,价格分别是buyi和selli,保证selli<buyi。由于身上最多只能带C个糖果,且在起点0号城市时身上是没有钱的,问到达n号城市的最小花费(可以是负数,即亏损)?
思路:
(1)每次离开i城市时,将C补满,并记录身上每个糖果的购买价(因为钱是可以负的,所以一定可以补满)。
(2)每次到达i城市时,先用最便宜的糖果作为路上的固定消耗。
(3)卖出糖果挣钱,并以卖价继续持有它(比较难想到的点)。
(4)"退"掉不挣钱的糖果,注意是退不是卖,即按原价退掉,就当作从未买过这些糖果(这是每次都将C补满的原因)。
问题在于怎么知道在哪个城市卖掉比较划算?
因为selli<buyi,所以在同城市按sell卖出后再按buy买入来补满C是不划算的,会亏了中间的差价。我们得在后面的城市根据价格,来决策前面的城市该不该卖糖果。那么将可卖的糖果卖出后,以卖价s继续买入,会有两种情况:
1、后面卖出可以赚更多。
之前卖s价所带来利润已经到手,所以后面卖出有赚也是可以保证利润的。
2、后面卖出会亏。
按s价(这是当时新买入价)退掉这些糖果,就相当于在当时就卖掉了。
#include <bits/stdc++.h>
#define max(X,Y) ((X) > (Y) ? (X) : (Y))
#define min(X,Y) ((X) < (Y) ? (X) : (Y))
#define pii pair<int,int>
#define INF 0x7f7f7f7f
#define LL long long
using namespace std;
const int N=;
int n;
LL dis[N], buy[N], sell[N], cap;
struct node
{
LL price;
int cnt;
node(){};
node(LL p, int c):price(p),cnt(c){};
}; LL cal()
{
deque<node> que(,node( buy[], cap) ); //当前持有。
LL ans=cap*buy[]; //最小费用,补满。 for(int i=; i<=n; i++)
{
LL tmp=dis[i]-dis[i-]; //手续费
LL sum=cap-tmp; //持有量。 for(; !que.empty(); que.pop_front()) //路上消耗最便宜的糖果。
{
node &t=que.front();
if(t.cnt>tmp)
{
t.cnt-=tmp;
break;
}
tmp-=que.front().cnt;
} //看能否卖掉一些。
LL cnt=;
for(; !que.empty(); que.pop_front())
{
node &t=que.front();
if(t.price>sell[i]) break;
cnt+=t.cnt;
}
if(cnt) que.push_front(node(sell[i], cnt)); //以sell价继续买入。 //看能否退掉一些:这里买比前面的还便宜,不如不带过来,那就按原价退
for( ; !que.empty(); que.pop_back())
{
node &t=que.back();
if(t.price<buy[i]) break;
ans-=t.price*t.cnt;
sum-=t.cnt; //当前持有量减少。
} que.push_back( node(buy[i], cap-sum) ); //补满!
ans+= (cap-sum)*buy[i];
}
while(!que.empty()) //按原价退,相当于从未买过这些
{
node &t=que.front();que.pop_front();
ans-=t.price*t.cnt;
}
return ans;
} int main()
{
freopen("input.txt", "r", stdin);
int t;
cin>>t;
while(t--)
{
scanf("%d%d", &n, &cap);
for(int i=; i<=n; i++) scanf("%lld", &dis[i]);
for(int i=; i<=n; i++) scanf("%lld %lld", &buy[i], &sell[i]);
printf("%lld\n",cal());
}
return ;
}
HDU 5380 Travel with candy (贪心,单调队列)的更多相关文章
- hdu 5380 Travel with candy(双端队列)
pid=5380">题目链接:hdu 5380 Travel with candy 保持油箱一直处于满的状态,维护一个队列,记录当前C的油量中分别能够以多少价格退货,以及能够推货的量. ...
- HDU 5380 Travel with candy 单调队列
pid=5380">链接 题解链接:http://www.cygmasot.com/index.php/2015/08/16/hdu_5380 题意: n C 一条数轴上有n+1个加油 ...
- hdu 3706 Second My Problem First 单调队列
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3706 Second My Problem First Time Limit: 12000/4000 M ...
- HDU 6047 Maximum Sequence (贪心+单调队列)
题意:给定一个序列,让你构造出一个序列,满足条件,且最大.条件是 选取一个ai <= max{a[b[j], j]-j} 析:贪心,贪心策略就是先尽量产生大的,所以就是对于B序列尽量从头开始,由 ...
- HDU 4122 Alice's mooncake shop 单调队列优化dp
Alice's mooncake shop Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem ...
- hdu 4122 Alice's mooncake shop(单调队列)
题目链接:hdu 4122 Alice's mooncake shop 题意: 有n个订单和可以在m小时内制作月饼 接下来是n个订单的信息:需要在mon月,d日,year年,h小时交付订单r个月饼 接 ...
- hdu 3415 Max Sum of Max-K-sub-sequence(单调队列)
题目链接:hdu 3415 Max Sum of Max-K-sub-sequence 题意: 给你一串形成环的数,让你找一段长度不大于k的子段使得和最大. 题解: 我们先把头和尾拼起来,令前i个数的 ...
- BZOJ 2424 订货(贪心+单调队列)
怎么题解都是用费用流做的啊...用单调队列多优美啊. 题意:某公司估计市场在第i个月对某产品的需求量为Ui,已知在第i月该产品的订货单价为di,上个月月底未销完的单位产品要付存贮费用m,假定第一月月初 ...
- HDU 4193 Non-negative Partial Sums【单调队列】
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4193 题意: 给定序列,可以把后面的连续的部分移到最前面来,问多少种移法使得最终得到的序列的前i项和 ...
随机推荐
- RESTful 架构与 RESTful 服务
风格 ⇒ 标准 ⇒ 协议 ⇒ 实现 Representational State Transfer,是一种软件架构风格,既然是风格,就非标准或协议,而是定义了一组设计原则和约束条件.具有如下特点: 适 ...
- 并不对劲的bzoj5475:loj2983:p5206:[wc2019]数树
题目大意 task0:有两棵\(n\)(n\leq10^5)个点的树\(T1,T2\),每个点的点权可以是一个在\([1,y]\)里的数,如果两个点既在\(T1\)中有直接连边,又在\(T2\)中有直 ...
- [Selenium] Selenium WebDriver 的下载和安装
为配合较为广泛使用Java 语言的程序员,仅以WebDriver 的Java语言绑定进行讲解. 步骤1:下载并安装Java开发环境 1)在系统中安装JDK(Java开发工具吧,Java Develop ...
- bzoj4555
ntt+cdq分治 原来zwh出的cf是斯特林 第二类斯特林数的定义是S(i,j)表示将i个物品分到j个无序集合的方案数,那么这道题中S(i,j)*j!*2^j是指将i个物品分到j个有序集合中并且每个 ...
- 线程间操作无效: 从不是创建控件“xxxxxxxx”的线程访问它。
方法一: Control.CheckForIllegalCrossThreadCalls = false; 方法二:(推荐) this.Invoke(new MethodInvoker(() => ...
- CreateThread创建线程 互斥量锁
HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes,//SD:线程安全相关的属性,常置为NULL SIZE_T dwStackS ...
- 字符指针unsigned char *ch_p
指向类型为unsigned char的指针变量叫字符指针. 例如: unsigned char ch = 'a'; unsigned char *ch_p = &ch;那么指针变量ch_p就是 ...
- hadoop推荐
hadoop官网 我以Hadoop 2.7.3为例. hadoop 2.7.3 官网 . 用的操作系统是64bit Ubuntu14.04. 其中我们还可以学习 Apache Maven Proje ...
- grep在指定类型的文件中查找字符 (转载)
转自:http://blog.csdn.net/qvbfndcwy/article/details/8127329 find -name '*.php'|xargs grep 'include'//在 ...
- [Shader 着色器]冰霜效果的思考和实现
http://game.ceeger.com/forum/read.php?tid=23209&fid=2 由于最近要做一个冰系的角色,就想能不能做一些冰霜效果.那么就试试吧,先弄一张原图: ...