description

小Y最近在一家金券交易所工作。该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下简称B券)。每个持有金券的顾客都有一个自己的帐户。金券的数目可以是一个实数。每天随着市场的起伏波动,两种金券都有自己当时的价值,即每一单位金券当天可以兑换的人民币数目。我们记录第 K 天中 A券 和 B券 的价值分别为 AK 和 BK(元/单位金券)。为了方便顾客,金券交易所提供了一种非常方便的交易方式:比例交易法。比例交易法分为两个方面:(a)卖出金券:顾客提供一个 [0,100] 内的实数 OP 作为卖出比例,其意义为:将 OP% 的 A券和 OP% 的 B券 以当时的价值兑换为人民币;(b)买入金券:顾客支付 IP 元人民币,交易所将会兑换给用户总价值为 IP 的金券,并且,满足提供给顾客的A券和B券的比例在第 K 天恰好为 RateK;例如,假定接
下来 3 天内的 Ak、Bk、RateK 的变化分别为:

假定在第一天时,用户手中有 100元 人民币但是没有任何金券。用户可以执行以下的操作:

注意到,同一天内可以进行多次操作。小Y是一个很有经济头脑的员工,通过较长时间的运作和行情测算,他已经知道了未来N天内的A券和B券的价值以及Rate。他还希望能够计算出来,如果开始时拥有S元钱,那么N天后最多能够获得多少元钱。

Input
输入第一行两个正整数N、S,分别表示小Y能预知的天数以及初始时拥有的钱数。接下来N行,第K行三个实数AK、BK、RateK,意义如题目中所述
对于100%的测试数据,满足:0<AK≤10;0<BK≤10;0<RateK≤100;MaxProfit≤0^9。
【提示】
1.输入文件可能很大,请采用快速的读入方式。
2.必然存在一种最优的买卖方案满足:
每次买进操作使用完所有的人民币;
每次卖出操作卖出所有的金券。

Output
只有一个实数MaxProfit,表示第N天的操作结束时能够获得的最大的金钱数目
答案保留3位小数。

Sample Input
3 100
1 1 1
1 2 2
2 2 3
Sample Output
225.000
Hint

solution

乍一看跟以前做过的股票交易挺像的,这个式子长得就斜率优化诱惑


Step1
贪心。。。
在某一天要么买股票把钱买完,要么卖股票把股票卖完
不会有人赚钱只赚一半就跑了吧


Step2
考虑列出状态转移方程
设fif_ifi​表示iii天能赚的最多的钱,aia_iai​为iii天最多能买的AAA股票数,bib_ibi​为iii天最多能买的BBB股票数
①在iii天买入股票ai=fi×RateiAi×Ratei+Bi,bi=fiAi×Ratei+Bia_i=\frac{f_i\times Rate_i}{A_i\times Rate_i+B_i},b_i=\frac{f_i}{A_i\times Rate_i+B_i}ai​=Ai​×Ratei​+Bi​fi​×Ratei​​,bi​=Ai​×Ratei​+Bi​fi​​
②在iii天不买不卖
fi=max(fi,fi−1)f_i=max(f_i,f_{i-1})fi​=max(fi​,fi−1​)
③在iii天卖股票,枚举在jjj天买入的股票
fi=max{aj∗Ai+bj∗Bi}f_i=max\{a_j*A_i+b_j*B_i\}fi​=max{aj​∗Ai​+bj​∗Bi​}
对式子进行变形
fi=max{Bi×(AiBi∗aj+bj)}f_i=max\{B_i\times (\frac{A_i}{B_i}*a_j+b_j)\}fi​=max{Bi​×(Bi​Ai​​∗aj​+bj​)}


Step3
李超线段树维护凸包
将fif_ifi​的式子看作直线kx+bkx+bkx+b
k=aj,x=AiBi,b=bjk=a_j,x=\frac{A_i}{B_i},b=b_jk=aj​,x=Bi​Ai​​,b=bj​

code

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
#define maxn 100005
int n;
double ans;
double A[maxn], B[maxn], Rate[maxn], c[maxn], x[maxn], k[maxn], b[maxn];
int t[maxn << 2];double calc( int i, int pos ) {return k[i] * x[pos] + b[i];
}void modify( int num, int l, int r, int id ) {if( l == r ) {if( calc( id, l ) > calc( t[num], l ) ) t[num] = id;return;}int mid = ( l + r ) >> 1;if( calc( id, mid ) > calc( t[num], mid ) ) swap( t[num], id );if( calc( id, l ) > calc( t[num], l ) ) modify( num << 1, l, mid, id );if( calc( id, r ) > calc( t[num], r ) ) modify( num << 1 | 1, mid + 1, r, id );
}double query( int num, int l, int r, int pos ) {if( l == r ) return calc( t[num], pos );int mid = ( l + r ) >> 1;if( pos <= mid ) return max( calc( t[num], pos ), query( num << 1, l, mid, pos ) );else return max( calc( t[num], pos ), query( num << 1 | 1, mid + 1, r, pos ) );
}int main() {scanf( "%d %lf", &n, &ans );for( int i = 1;i <= n;i ++ ) {scanf( "%lf %lf %lf", &A[i], &B[i], &Rate[i] );x[i] = c[i] = A[i] / B[i];}sort( x + 1, x + n + 1 );for( int i = 1;i <= n;i ++ ) {int p = lower_bound( x + 1, x + n + 1, c[i] ) - x;ans = max( ans, B[i] * query( 1, 1, n, p ) );double g = A[i] * Rate[i] + B[i];k[i] = ans * Rate[i] / g, b[i] = ans / g;modify( 1, 1, n, i );}printf( "%.3f\n", ans );return 0;
}

[NOI2007] 货币兑换 (dp+李超树维护凸包)相关推荐

  1. 【李超树】李超线段树维护凸包(凸壳) (例题:blue mary开公司+线段游戏+ZZH的旅行)

    文章目录 前言 李超树 引入(斜率优化) 什么是李超树? 李超树活着能干点什么? 算法思想(使用手册?) 插入 查询 模板 判断是否覆盖(优不优) 插入 查询 例题 板题:BlueMary开公司 分析 ...

  2. [动态dp]线段树维护转移矩阵

    背景:czy上课讲了新知识,从未见到过,总结一下. 所谓动态dp,是在动态规划的基础上,需要维护一些修改操作的算法. 这类题目分为如下三个步骤:(都是对于常系数齐次递推问题) 1先不考虑修改,不考虑区 ...

  3. 【NOI模拟赛】黑色大桥(DP优化,李超树)

    题面 时间限制:1s,空间限制:1024MB 题目描述 手拿咒刃砍金门,众神直呼不是人 椅子玩自定义咒刃,一路打到了第三关的银行,祂想在黑色大桥无伤看守者之前找点刺激的. 加了模组的银行极大.具体地说 ...

  4. [多校 NOIP 联合模拟 11.30 T4] ZZH 的旅行(李超树合并) | 错题本

    文章目录 题目 分析 代码 题目 给一棵第 iii 条边边权为 did_idi​ 的有根树,111 为根.对于每个点 xxx,对于满足如下条件的序列 {s1,⋯,sk}\{s_1,\cdots,s_k ...

  5. BZOJ 2149 拆迁队 斜率优化DP 主席树

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2149 题目大意: 一个长度为 n n的序列aa,改变其中的某些数使之成为一个单调递增序列, ...

  6. [NOI2007]货币兑换Cash(DP+动态凸包)

    第一次打动态凸包维护dp,感觉学到了超级多的东西. 首先,set是如此的好用!!!可以通过控制一个flag来实现两种查询,维护凸包和查找斜率k 不过就是重载运算符和一些细节方面有些恶心,90行解决 后 ...

  7. 【BZOJ1492】【NOI2007】—Cash(cdq分治维护凸包优化斜率dp)

    传送门 考虑令f[i]f[i]f[i]为第iii天得到的最多的AAA券,g[i]g[i]g[i]为第iii天得到的最多的BBB券 则g[i]=f[i]/rate[i]g[i]=f[i]/rate[i] ...

  8. [BZOJ1492] [NOI2007]货币兑换Cash 斜率优化+cdq/平衡树维护凸包

    1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 5907  Solved: 2377 [Submit][S ...

  9. 【bzoj 1492】【codevs 1797】 [NOI2007]货币兑换Cash (dp+cdq分治)

    1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 3803  Solved: 1604 [Submit][S ...

最新文章

  1. npm镜像源的查看和切换
  2. 利用Web Services开发分布式应用
  3. 计算机联锁仿真软件设计,一种基于LabVIEW的计算机联锁仿真系统的制作方法
  4. CEdit里''\r\n才是换行
  5. Spring5的AOP 和设备支持
  6. STM32技术文档里面的I / O Level FT具体含义
  7. 信息学奥赛一本通 1308:【例1.5】高精除
  8. IOS开发之日期时间格式化字符说明
  9. PPDuck3 for Mac(pp鸭图片批量压缩工具)最新官方版免下载
  10. 论文:Object-centric Auto-encoders and Dummy Anomalies for Abnormal Event Detection in Video阅读遇到的问题及解答
  11. 按国家归类的海淘网站大全
  12. 1路编码器脉冲计数器或2路DI高速计数器,Modbus RTU模块 WJ150
  13. PyQt主窗口、对话框
  14. 记spring boot + shiro 认证,anon失效的问题的一种解决方式
  15. TI C66x DSP 系统events及其应用 - 1
  16. 王者服务器维护7月九号,王者荣耀S20赛季确定7月9号开始,钻石夺宝新增猛男专用拖尾特效...
  17. 用 turtle 绘制圆形
  18. 信道估计中的导频结构
  19. excel数据多列排序
  20. 第一次尝试使Windows Live Writer发布日志

热门文章

  1. html、css、js注释,js,html,css注释大集合
  2. 鸿蒙手机启动器apk下载,澪Pro启动器本体下载最新版
  3. JSP的HTML基础实验原理,实验四 JSP基础语法
  4. tcp抓包返回fin_TCP/IP学习二TCP链接建立与断开
  5. python第k序列元素查找_Python寻找第k小的元素
  6. python读取日志错误信息_关于修复 Bug 这件“小事”|利用Python 日志查找错误也可行...
  7. 安装默认报表服务器虚拟目录,本机模式安装默认配置 (Reporting Services)
  8. tcp unity 图片_用 Unity 做个游戏(七) - TCP Socket 客户端
  9. leetcode145. 二叉树的后序遍历
  10. [Java基础]方法引用