【BZOJ-1492】货币兑换Cash DP + 斜率优化 + CDQ分治
1492: [NOI2007]货币兑换Cash
Time Limit: 5 Sec Memory Limit: 64 MB
Submit: 3396 Solved: 1434
[Submit][Status][Discuss]
Description
.png)
.png)
Input
Output
只有一个实数MaxProfit,表示第N天的操作结束时能够获得的最大的金钱数目。答案保留3位小数。
Sample Input
1 1 1
1 2 2
2 2 3
Sample Output
HINT
.png)
Source
Solution
斜率优化DP,典型的不单调
$f[i]=max(f[i],f[j]/(a[j]*rate[j]+b[j])*rate[j]*a[i]+f[j]/(a[j]*rate[j]+b[j])*b[i])$
至于CDQ分治的理论:移步 折越
启发:
1.斜率优化DP变化万千..
2.熟练掌握分治算法能够产生很多神奇的功效(xyx好像很喜欢分治)
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define maxn 200010
struct DayNode
{
double A,B,Ra,k; int id;
bool operator < (const DayNode & T) const
{return k<T.k;}
}a[maxn],tmpa[maxn];
struct PointNode{double x,y;}p[maxn],tmpp[maxn];
int N;
double dp[maxn];
int tmp1[maxn],tmp2[maxn],stack[maxn];
#define inf 1e9
#define eps 1e-9
double slope(int l1,int l2)
{
if (!l1) return -inf;
if (!l2) return inf;
if (fabs(p[l1].x-p[l2].x)<=eps) return -inf;
return (p[l1].y-p[l2].y)/(p[l1].x-p[l2].x);
}
void CDQ(int l,int r)
{
if (l==r)
{
dp[l]=max(dp[l],dp[l-]);
p[l].y=dp[l]/(a[l].Ra*a[l].A+a[l].B);
p[l].x=a[l].Ra*p[l].y;
return;
}
int mid=(l+r)>>,L,R;
L=l; R=mid+;
for (int i=l; i<=r; i++)
if (a[i].id<=mid) tmpa[L++]=a[i]; else tmpa[R++]=a[i];
for (int i=l; i<=r; i++) a[i]=tmpa[i];
CDQ(l,mid);
int top=;
for (int i=l; i<=mid; i++)
{
while (top> && slope(stack[top],stack[top-])<slope(i,stack[top-])+eps) top--;
stack[++top]=i;
}
int Top=;
for (int i=r; i>=mid+; i--)
{
while (Top<top && slope(stack[Top],stack[Top+])+eps>a[i].k) Top++;
dp[a[i].id]=max(dp[a[i].id],p[stack[Top]].x*a[i].A+p[stack[Top]].y*a[i].B);
}
CDQ(mid+,r);
L=l; R=mid+;
for (int i=l; i<=r; i++)
if (((p[L].x<p[R].x+eps || (fabs(p[L].x-p[R].x)<=eps && p[L].y<p[R].y+eps)) || R>r) && L<=mid)
tmpp[i]=p[L++];
else tmpp[i]=p[R++];
for (int i=l; i<=r; i++) p[i]=tmpp[i];
}
int main()
{
scanf("%d%lf",&N,&dp[]);
for (int i=; i<=N; i++)
scanf("%lf%lf%lf",&a[i].A,&a[i].B,&a[i].Ra),a[i].k=-a[i].A/a[i].B,a[i].id=i;
sort(a+,a+N+);
CDQ(,N);
//for (int i=1; i<=N; i++) printf("%d %d %.3lf %.3lf %.3lf %.3lf \n",i,a[i].id,a[i].A,a[i].B,a[i].Ra,a[i].k);
printf("%.3lf\n",dp[N]);
return ;
}
【BZOJ-1492】货币兑换Cash DP + 斜率优化 + CDQ分治的更多相关文章
- BZOJ.1492.[NOI2007]货币兑换(DP 斜率优化 CDQ分治/Splay)
BZOJ 洛谷 如果某天能够赚钱,那么一定会在这天把手上的金券全卖掉.同样如果某天要买,一定会把所有钱花光. 那么令\(f_i\)表示到第\(i\)天所拥有的最多钱数(此时手上没有任何金券),可以选择 ...
- 洛谷.4655.[CEOI2017]Building Bridges(DP 斜率优化 CDQ分治)
LOJ 洛谷 \(f_i=s_{i-1}+h_i^2+\min\{f_j-s_j+h_j^2-2h_i2h_j\}\),显然可以斜率优化. \(f_i-s_{i-1}-h_i^2+2h_ih_j=f_ ...
- BZOJ_3963_[WF2011]MachineWorks_斜率优化+CDQ分治
BZOJ_3963_[WF2011]MachineWorks_斜率优化+CDQ分治 Description 你是任意性复杂机器公司(Arbitrarily Complex Machines, ACM) ...
- [BZOJ1492][NOI2007]货币兑换Cash(斜率优化+CDQ分治)
1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 5838 Solved: 2345[Submit][Sta ...
- 【BZOJ1492】[NOI2007]货币兑换Cash 斜率优化+cdq分治
[BZOJ10492][NOI2007]货币兑换Cash Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下简称B券).每 ...
- 洛谷P4027 [NOI2007]货币兑换(dp 斜率优化 cdq 二分)
题意 题目链接 Sol 解题的关键是看到题目里的提示... 设\(f[i]\)表示到第\(i\)天所持有软妹币的最大数量,显然答案为\(max_{i = 1}^n f[i]\) 转移为\(f_i = ...
- BZOJ 1492 货币兑换 Cash CDQ分治
这题n2算法就是一个维护上凸包的过程. 也可以用CDQ分治做. 我的CDQ分治做法和网上的不太一样,用左边的点建立一个凸包,右边的点在上面二分. 好处是思路清晰,避免了凸包的插入删除,坏处是多了一个l ...
- LUOGU P4027 [NOI2007]货币兑换 (斜率优化+CDQ分治)
传送门 解题思路 题目里有两句提示一定要看清楚,要不全买要不全卖,所以dp方程就比较好列,f[i]=max(f[j]*rate[j]*a[i])/(rate[j]*a[j]+b[j])+(f[j]*b ...
- bzoj1492/luogu4027 货币兑换 (斜率优化+cdq分治)
设f[i]是第i天能获得的最大钱数,那么 f[i]=max{在第j天用f[j]的钱买,然后在第i天卖得到的钱,f[i-1]} 然后解一解方程什么的,设$x[j]=\frac{F[j]}{A[j]*Ra ...
随机推荐
- Cordova - 常用的插件汇总(附插件的安装、查询、更新、删除等命令)
Hybrid应用比web应用强大之处在于可以使运行在容器中的web内容访问 native APIs.Cordova 提供了许多插件用于调用移动设备上的API. 一,插件相关常用命令 1,查看所有已 ...
- 在linux下运行java工程
在linux 服务器上运行JAVA工程需注意.1: 在linux 上: /etc/profile 设置classpath 配置正确的jar 路径.2: 把本地JAVA工程做成一个jar包.如:1. ...
- Delete Node in a Linked List
Write a function to delete a node (except the tail) in a singly linked list, given only access to th ...
- Linux wait函数详解
wait和waitpid出现的原因 SIGCHLD --当子进程退出的时候,内核会向父进程SIGCHLD信号,子进程的退出是个异步事件(子进程可以在父进程运行的任何时刻终止) --子进程退出时,内核将 ...
- 关于NOIP2016与NOI2018
NOIP2016惨淡收场了,距离省一还有相当一大段距离,省队更是差了十条街去了,不过没关系. 既然已经对信息学产生了兴趣,竞赛无疑是最好的锻炼场所. 路是自己选择的,伤痕累累也要走下去. 还有一年,事 ...
- JS明确指定函数的接受者
由于方法和值为对象的属性值没什么区别,因此很容易提取对象的方法作为回调函数直接传递给高阶函数.但这也很容易忘记应明确指定方法的接受者.例如,一个字符串缓冲对象使用数组来存储字符串. var buffe ...
- Caffe学习系列(3):视觉层(Vision Layers)及参数
所有的层都具有的参数,如name, type, bottom, top和transform_param请参看我的前一篇文章:Caffe学习系列(2):数据层及参数 本文只讲解视觉层(Vision La ...
- SQLServer(MSSQL)、MySQL、SQLite、Access相互迁移转换工具 DB2DB v1.4
最近公司有一个项目,需要把原来的系统从 MSSQL 升迁到阿里云RDS(MySQL)上面.为便于测试,所以需要把原来系统的所有数据表以及测试数据转换到 MySQL 上面.在百度上找了很多方法,有通过微 ...
- Google最新截屏案例详解
Google从Android 5.0 开始,给出了截屏案例ScreenCapture,在同版本的examples的Media类别中可以找到.给需要开发手机或平板截屏应用的小伙伴提供了非常有意义的参考资 ...
- ASP.NET Web API(三):安全验证之使用摘要认证(digest authentication)
在前一篇文章中,主要讨论了使用HTTP基本认证的方法,因为HTTP基本认证的方式决定了它在安全性方面存在很大的问题,所以接下来看看另一种验证的方式:digest authentication,即摘要认 ...