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

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_iaiiii天最多能买的AAA股票数,bib_ibiiii天最多能买的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+Bifi×Ratei,bi=Ai×Ratei+Bifi
②在iii天不买不卖
fi=max(fi,fi−1)f_i=max(f_i,f_{i-1})fi=max(fi,fi1)
③在iii天卖股票,枚举在jjj天买入的股票
fi=max{aj∗Ai+bj∗Bi}f_i=max\{a_j*A_i+b_j*B_i\}fi=max{ajAi+bjBi}
对式子进行变形
fi=max{Bi×(AiBi∗aj+bj)}f_i=max\{B_i\times (\frac{A_i}{B_i}*a_j+b_j)\}fi=max{Bi×(BiAiaj+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=BiAi,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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317592.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CF1379F1 Chess Strikes Back (easy version)(鸽笼原理、线段树)

解析 很神奇的一道题 关键在于把22的正方形看成一个单位的转化 由于每个22最多有一个国王 因此每个2*2都一定有一个国王 这是本题的关键 个人感觉这个思想很像鸽笼原理 至于后面的线段树就水到渠成了 代码 #include<bits/stdc.h> using namespace std; #define ll l…

[ZJOI2008]树的统计

[ZJOI2008]树的统计 题意&#xff1a; 题解&#xff1a; 树链剖分模板题&#xff0c;好久没打都忘了 代码&#xff1a; #include <algorithm> #include <cstdio> #include <cstring> #define lc o << 1 #define rc o << 1 | 1 const int max…

AT3860-[AGC020F]Arcs on a Circle【dp】

正题 题目链接:https://www.luogu.com.cn/problem/AT3860 题目大意 有一个周长为mmm的圆&#xff0c;nnn条线段&#xff0c;第iii条长度为aia_iai​&#xff0c;将线段贴在圆的随机位置上&#xff0c;求整个圆都被覆盖的概率。 1≤n≤6,1≤m≤501\leq n\leq 6,1\leq m\le 501…

带你学习AOP框架之Aspect.Core[1]

在软件业&#xff0c;AOP为Aspect Oriented Programming的缩写&#xff0c;意为&#xff1a;面向切面编程&#xff0c;通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续&#xff0c;是软件开发中的一个热点&#xff0c;是函数式编程的一种衍生…

「雅礼集训 2017 Day7」事情的相似度(后缀自动机+LCT+树状数组)

description 点击查看题目内容 solution Step1 无脑建SAMSAMSAM 两个前缀的最长公共后缀就是parent−treeparent-treeparent−tree上两点的lcalcalca&#xff0c;定义知显然 Step2 离线询问&#xff0c;按右端点从小到大排序 Step3 每加入一个字母&#xff0c;就将tatata在p…

CF1396B Stoned Game(博弈论)

解析 上午模拟被博弈论虐&#xff0c;下午被黄色的博弈论虐 qwq 首先的一个结论是&#xff1a; 如果有一堆超过总体的一半&#xff0c;那么先手只需要守住这堆就稳赢了 如果没有这样的一堆&#xff0c;可以证明&#xff0c;最后一定可以全部拿完 假设最后有一堆k没拿完&…

主席树

大一寒假的时候学了主席树&#xff0c;当时还录了视频发b站上&#xff0c;过了好久没用都忘了差不多 这篇文章讲的非常详细&#xff0c;我就直接借用过来 静态主席树 总结一下就是&#xff1a; 代码&#xff1a; 对于每一种状态建立一个线段树&#xff0c;为了防止mle&#xf…

P7735-[NOI2021]轻重边【树链剖分,线段树】

前言 之前线上赛就A的题现在才写博客 正题 题目链接:https://www.luogu.com.cn/problem/P7735 题目大意 有nnn个点的一棵树&#xff0c;开始所有边都是轻边&#xff0c;mmm次操作。 把x→yx\rightarrow yx→y路径上所有点连接的重边都变为轻边&#xff0c;然后再把路径上的…

.NET Core实战项目之CMS 第十六章 用户登录及验证码功能实现

前面为了方便我们只是简单实现了基本业务功能的增删改查&#xff0c;但是登录功能还没有实现&#xff0c;而登录又是系统所必须的&#xff0c;得益于 ASP.NET Core的可扩展性因此我们很容易实现我们的登录功能。今天我将带着大家一起来实现下我们的ASP.NET Core2.2开发的CMS系统…

CF508D Tanya and Password(欧拉回路)

解析 之前模拟考过的一道题 把字符串当成前后缀之间的连边即可 注意即使图的度数符合要求&#xff0c;也可能由于不连通而无解&#xff0c;需要再特判一下 #include<bits/stdc.h> using namespace std; #define ll long long #define ull unsigned long long const int…

[HEOI2016/TJOI2016]字符串 (后缀数组+主席树+二分)

description 佳媛姐姐过生日的时候&#xff0c;她的小伙伴从某东上买了一个生日礼物。生日礼物放在一个神奇的箱子中。箱子外边写了一个长为 n 的字符串 s&#xff0c;和 m 个问题。佳媛姐姐必须正确回答这 m 个问题&#xff0c;才能打开箱子拿到礼物&#xff0c;升职加薪&…

[SDOI2014]旅行

[SDOI2014]旅行 题意&#xff1a; n个城市&#xff0c;n-1条边&#xff0c;任意两个城市互通&#xff0c;每个城市有所信奉的宗教和城市评级&#xff0c;有四种指令&#xff1a; 1.将城市x的居民改信为c教 2.将城市x的评级调整为w 3.统计x到y&#xff0c;路上所有的城市的评级…

YbtOJ-染色计划【树链剖分,线段树,tarjan】

正题 题目大意 给出nnn个点的一棵树&#xff0c;每个点有个颜色aia_iai​&#xff0c;你每次可以选择一个颜色全部变成另一个颜色。 求最少多少次操作可以把一种颜色变成一个完整的连通块。 1≤k≤n≤21051\leq k\leq n\leq 2\times 10^51≤k≤n≤2105 解题思路 考虑如果我们…

张高兴的 .NET Core IoT 入门指南:环境配置、Blink、部署

如何在 Raspberry Pi 的 Raspbian 上构建使用 GPIO 引脚的 IoT 程序&#xff1f;你可能会回答使用 C 或 Python 去访问 Raspberry Pi 的引脚。现在&#xff0c;C# 程序员可以使用 .NET Core 在 Raspbian(Linux) 上构建 IoT 应用程序。只需要引入 System.Device.GPIONuGet 包即可…

CF183C:Diverse Permutation(构造)

解析 首先考虑如何构造kn-1的情况 发现令排列为1,n,2,n-1…即可 那么在k不等于n-1时 只需要让前k项与上面的序列相同&#xff0c;后面公差为1即可 代码 #include<bits/stdc.h> using namespace std; #define ll long long #define ull unsigned long long const int N…

CF603E-Pastoral Oddities【CDQ分治,可撤销并查集】

正题 题目链接:https://www.luogu.com.cn/problem/CF603E 题目大意 开始时有nnn个点&#xff0c;没有边。 依次加入mmm条带权的边&#xff0c;每次加入后询问是否存在一个边集&#xff0c;满足每个点的度数均为奇数&#xff0c;求使得这个边集的最大权值最小。 1≤n≤105,1≤…

2020ICPC 江西省大学生程序设计竞赛

2020ICPC 江西省大学生程序设计竞赛

在AspNetMvc中使用日志面板. Logdashboard 1.1beta

Logdashboard是Net下的日志面板,它支持AspNet与AspNetCore项目。关于更多LogDashboard的介绍请看这里--使用logdashboard查看可视化日志。就在刚刚LogDashboard发布了1.1的beta版,在这个版本中有以下变化https://github.com/liangshiw/LogDashboard/releases支持NetFramework的…

【正睿2021寒假省选第二轮集训 day 1】令牌生成 (组合数+二分)

description solution 打表yyds 其实符合条件的个数跟nnn&#xff08;非题目中的意思&#xff09;有着等差数列公式的千丝万缕关系 所以可以二分出具体值 最后答案的取值范围一定是长成[,)[,)[,)&#xff0c;左闭右开的形式的 而且两个边界一定是只差了最小的那个111&#xff…

CF600F:Edge coloring of bipartite graph(二分图、构造)

解析 首先大胆猜结论&#xff1a;答案就是最大的点度数 考虑如何构造 设一个点联通的边的颜色集合为S&#xff0c;由题意得S中的元素不可重 假设新加入一条边(u,v) 设c1mex(Su),c2mex(Sv)c1mex(S_u),c2mex(S_v)c1mex(Su​),c2mex(Sv​) 如果c1等于c2&#xff0c;直接连就行了…