【BZOJ】1492: [NOI2007]货币兑换Cash
【题意】初始资金s,有两种金券A和B,第i天,买入时将投入的资金购买比例为rate[i]的两种股票,卖出时将持有的一定比例的两种股票卖出,第i天股票价格为A[i],B[i],求最大获利。n<=100000。
【算法】动态规划+斜率优化(CDQ分治)
【题解】为了最大获利,每次交易一定是全部买进和全部卖出。
令s[i]表示前i天的最大获利,f[i]表示第i天能购买的最多A股数,g[i]=f[i]/rate[i]表示第i天能购买的最多B股数。
s[i]=max{ s[i-1] , f[j]*A[i]+g[j]*B[i] },j<i。
g[i]=s[i]/(A[i]*rate[i]+B[i])
f[i]=g[i]*rate[i]
对于决策j和k,假设f[j]<f[k],当k优于j时有:
f[j]*A[i]+g[j]*B[i]<f[k]*A[i]+g[k]*B[i]
移向得(g[j]-g[k])/(f[j]-f[k])>-A[i]/B[i],令k[i]=-A[i]/B[i],所以:
对于满足f[j]<f[k]的决策j和k,满足(g[j]-g[k])/(f[j]-f[k])>k[i]时决策k优于决策j。
然后用CDQ分治维护动态上凸包,按阶段分治,左子区间按x[]排序构造凸包,右子区间按k[]排序顺序决策。
具体过程见:CDQ分治优化动态规划
复杂度O(n log n)。
#include<cstdio>
#include<cstring>
#include<cctype>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=;
const double eps=1e-,inf=;
double s[maxn];
int n,st[maxn];
struct cyc{int id;double A,B,r,k,x,y;}a[maxn],b[maxn];
bool cmp(cyc a,cyc b){return a.k>b.k;}
double k(int A,int B){
if(fabs(a[A].x-a[B].x)<eps){if(a[B].y<a[A].y)return -inf;else return inf;}
return (a[A].y-a[B].y)/(a[A].x-a[B].x);
}
void CDQ(int l,int r){
if(l==r){
s[l]=max(s[l],s[l-]);
a[l].y=s[l]/(a[l].A*a[l].r+a[l].B);
a[l].x=a[l].y*a[l].r;
return;
}
int mid=(l+r)>>;
int x1=l-,x2=mid;
for(int i=l;i<=r;i++)if(a[i].id<=mid)b[++x1]=a[i];else b[++x2]=a[i];
for(int i=l;i<=r;i++)a[i]=b[i];
CDQ(l,mid);
int top=;
for(int i=l;i<=mid;i++){
while(top>&&k(st[top],i)>k(st[top-],st[top]))top--;
st[++top]=i;
}
int x=;
for(int i=mid+;i<=r;i++){
while(x<top&&k(st[x],st[x+])>a[i].k)x++;
s[a[i].id]=max(s[a[i].id],a[st[x]].x*a[i].A+a[st[x]].y*a[i].B);
}
CDQ(mid+,r);
x1=l,x2=mid+;
for(int i=l;i<=r;i++){
if(x1>mid)b[i]=a[x2++];else
if(x2>r)b[i]=a[x1++];else
if(a[x1].x<a[x2].x)b[i]=a[x1++];else b[i]=a[x2++];
}
for(int i=l;i<=r;i++)a[i]=b[i];
}
int main(){
scanf("%d%lf",&n,&s[]);
for(int i=;i<=n;i++){
a[i].id=i;
scanf("%lf%lf%lf",&a[i].A,&a[i].B,&a[i].r);
a[i].k=-a[i].A/a[i].B;
}
sort(a+,a+n+,cmp);
CDQ(,n);
printf("%.3lf",s[n]);
return ;
}
【BZOJ】1492: [NOI2007]货币兑换Cash的更多相关文章
- BZOJ 1492: [NOI2007]货币兑换Cash( dp + 平衡树 )
dp(i) = max(dp(i-1), x[j]*a[i]+y[j]*b[i]), 0<j<i. x, y表示某天拥有的最多钱去买金券, 金券a和金券b的数量. 然后就很明显了...平衡 ...
- ●BZOJ 1492 [NOI2007]货币兑换Cash
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1492 题解: 斜率优化DP,CDQ分治 定义$DP[i]$为第i天结束后的最大收益. 由于题 ...
- bzoj 1492 [NOI2007]货币兑换Cash(斜率dp+cdq分治)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1492 [题意] 有AB两种货币,每天可以可以付IPi元,买到A券和B券,且A:B= ...
- 斜率优化(CDQ分治,Splay平衡树):BZOJ 1492: [NOI2007]货币兑换Cash
Description Input 第一行两个正整数N.S,分别表示小Y 能预知的天数以及初始时拥有的钱数. 接下来N 行,第K 行三个实数AK.BK.RateK,意义如题目中所述 Output 只有 ...
- BZOJ 1492: [NOI2007]货币兑换Cash [CDQ分治 斜率优化DP]
传送门 题意:不想写... 扔链接就跑 好吧我回来了 首先发现每次兑换一定是全部兑换,因为你兑换说明有利可图,是为了后面的某一天两种卷的汇率差别明显而兑换 那么一定拿全利啊,一定比多天的组合好 $f[ ...
- bzoj 1492: [NOI2007]货币兑换Cash
Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下 简称B券).每个持有金券的顾客都有一个自己的帐户.金券的数目可以是一个 ...
- BZOJ 1492 [NOI2007]货币兑换Cash:斜率优化dp + cdq分治
传送门 题意 初始时你有 $ s $ 元,接下来有 $ n $ 天. 在第 $ i $ 天,A券的价值为 $ A[i] $ ,B券的价值为 $ B[i] $ . 在第 $ i $ 天,你可以进行两种操 ...
- bzoj 1492: [NOI2007]货币兑换Cash【贪心+斜率优化dp+cdq】
参考:http://www.cnblogs.com/lidaxin/p/5240220.html 虽然splay会方便很多,但是懒得写,于是写了cdq 首先要想到贪心的思路,因为如果在某天买入是能得到 ...
- BZOJ 1492 [NOI2007]货币兑换Cash (CDQ分治/splay 维护凸包)
题目大意:太长了略 splay调了两天一直WA弃疗了 首先,我们可以猜一个贪心,如果买/卖,就一定都买/卖掉,否则不买/卖 反正货币的行情都是已知的,没有任何风险,所以肯定要选择最最最优的方案了 容易 ...
- BZOJ 1492: [NOI2007]货币兑换Cash 斜率优化 + splay动态维护凸包
Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下 简称B券).每个持有金券的顾客都有一个自己的帐户.金券的数目可以是一个 ...
随机推荐
- OSG学习:用多通道(multiple passes)实现透明度
osgFX库提供了一个用于多通道渲染(multi-pass rendering)的框架.每个你想要渲染的子图都应该被添加到osgFX::Effect节点,多通道技术的定义和使用都可以在这个节点中完成. ...
- jdbc 3.0
1.将Blob.Clob类型数据保存到数据库 import java.io.File; import java.io.FileInputStream; import java.io.FileReade ...
- Beta阶段冲刺第二天
提供当天站立式会议照片一张 讨论项目每个成员的昨天进展 错题集功能编写没有彻底完成. 界面改善 测试数据库连接 讨论项目每个成员的存在问题 邹其元:错题集功能需要用到数据库,现在要解决的问题是怎样把数 ...
- 爬虫学习之-操作mysql
在操作数据库的时候,python2中一般使用mysqldb,但在python3中已经不在支持mysqldb了,我们可以用pymysql和mysql.connector.本文的所有操作都是在python ...
- laraven安装记录
版本4.2.11 下载地址:https://codeload.github.com/laravel/laravel/zip/v4.2.11 步骤: 1.解压到目录 2.下载composer,并放到/u ...
- ETL技术( Extract-Transform-Load) 数据仓库技术-比如kettle
每次面试,互联网的面试官,经常问我有没有用过ETL,每次我都懵逼,说没用过,觉得是多么高大上的东东,数据仓储 今天查了一下,我晕,自己天天用的Kettle就是最典型的ETL, 可以实现不同数据库之间的 ...
- Java Map获取key和value 以及String字符串转List方法
一.问题描述 这里描述两个问题: 1.Java Map获取key和value的方法: 2.String字符串转List的方法: 二.解决方法 1.Java Map获取key和value的方法 2. ...
- 第99天:CSS3中透视perspective
CSS3中透视perspective 透视原理: 近大远小 . 浏览器透视:把近大远小的所有图像,透视在屏幕上. 理解浏览器的坐标系:浏览器平面为 Z=0的平面,坐标原点默认为图片的中心,可以通过更改 ...
- angularjs 常用功能练习
<!DOCTYPE html> <html ng-app="app"> <head> <meta charset="utf-8& ...
- BZOJ 1226 学校食堂(状压DP)
状压DP f(i,j,k)表示前i−1个人已经吃了饭,且在i之后的状态为j的人也吃了饭(用二进制表示后面的状态),最后吃的那个人是i之后的第k个 (注意k可以是负数) 然后 如果j&1=1那么 ...