Description

Link.

一共 \(n\) 天,每天可以卖出或者买入两种股票 \(A\) 和 \(B\)。这两种股票在第 \(i\) 天的价值为 \(A_i\) 和 \(B_i\)。

每天可以花所有的现金买入股票,这些股票中 \(A\) 股与 \(B\) 股的数量比为 \(rate_i\)。每天也可以把所有的股票以当天的价值卖出,获得现金。已知接下来 \(n\) 天的 \(A_i,B_i,rate_i\),求出 \(n\) 天后能够获得的最大价值。

Solution

设 \(f(i)\) 为第 \(i\) 天的最大钱数,\(g_{1}(i)\) 为 A 券的第 \(i\) 天能换的数量,\(g_{2}(i)\) 则为 B 券。

转移可以解方程得:

\[f(i)=\max\{f(i-1),a(i)g_{1}(j),b(i)g_{2}(j)\},j\in[1,i) \\
g_{1}(i)\frac{f(i)rate(i)}{a(i)rate(i)+b(i)} \\
g_{2}(i)=\frac{f(i)}{rate(i)\times a(i)+b(i)} \\
\]

两个 \(g\) 都没啥问题,主要来看 \(f(i)\)。提一下可得:

\[f(i)=\max\{b(i)\max_{j=1}^{i-1}\{\frac{a(i)}{b(i)}g_{1}(j)+g_{2}(j)\},f(i-1)\}
\]

斜率优化的形式,但斜率并无单调性。那个 \(f(i-1)\) 可以最后来线性做,所以可以先不管。然后就是 li-chao tree 的板子。

#include<bits/stdc++.h>
std::vector<double> pri;
int n,nodes[400010];
double g[5][100010],f[100010],a[100010],b[100010],rate[100010],slp[100010];
double _f(int i,int j){return pri[i-1]*g[1][j]+g[2][j];}
void ins(int l,int r,int x,int i)
{
if(l^r)
{
int mid=(l+r)>>1;
if(_f(mid,i)>_f(mid,nodes[x])) std::swap(nodes[x],i);
if(_f(l,i)>_f(l,nodes[x])) ins(l,mid,x<<1,i);
else ins(mid+1,r,x<<1|1,i);
}
else if(_f(l,i)>_f(l,nodes[x])) nodes[x]=i;
}
double find(int l,int r,int x,int i)
{
if(l^r)
{
int mid=(l+r)>>1;
if(mid>=i) return std::max(find(l,mid,x<<1,i),_f(i,nodes[x]));
else return std::max(find(mid+1,r,x<<1|1,i),_f(i,nodes[x]));
}
else return _f(i,nodes[x]);
}
#define All(x) (x).begin(),(x).end()
int main()
{
double pref=0,nowf=0;
scanf("%d %lf",&n,&nowf);
pref=nowf;
for(int i=1;i<=n;++i)
{
scanf("%lf %lf %lf",&a[i],&b[i],&rate[i]);
slp[i]=a[i]/b[i];
pri.emplace_back(slp[i]);
}
std::sort(All(pri));
for(int i=1;i<=n;++i)
{
nowf=std::max(pref,b[i]*find(1,n,1,std::lower_bound(All(pri),slp[i])-pri.begin()+1));
g[1][i]=nowf*rate[i]/(a[i]*rate[i]+b[i]);
g[2][i]=nowf/(a[i]*rate[i]+b[i]);
ins(1,n,1,i);
pref=nowf;
}
printf("%.3f\n",nowf);
return 0;
}

Solution -「NOI 2007」货币兑换的更多相关文章

  1. Solution -「NOI 2021」「洛谷 P7740」机器人游戏

    \(\mathcal{Description}\)   Link.   自己去读题面叭~ \(\mathcal{Solution}\)   首先,参悟[样例解释 #2].一种暴力的思路即为钦定集合 \ ...

  2. Solution -「NOI 2020」「洛谷 P6776」超现实树

    \(\mathcal{Description}\)   Link.   对于非空二叉树 \(T\),定义 \(\operatorname{grow}(T)\) 为所有能通过若干次"替换 \( ...

  3. Solution -「NOI 2016」「洛谷 P1587」循环之美

    \(\mathcal{Description}\)   Link.   给定 \(n,m,k\),求 \(x\in [1,n]\cap\mathbb N,y\in [1,m]\cap \mathbb ...

  4. Solution -「NOI 2012」「洛谷 P2050」美食节

    \(\mathcal{Description}\)   Link.   美食节提供 \(n\) 种菜品,第 \(i\) 种的需求量是 \(p_i\),菜品由 \(m\) 个厨师负责制作,第 \(j\) ...

  5. Solution -「NOI 2008」「洛谷 P3980」志愿者招募

    \(\mathcal{Description}\)   Link.   一项持续 \(n\) 天的任务,第 \(i\) 天需要至少 \(a_i\) 人工作.还有 \(m\) 种雇佣方式,第 \(i\) ...

  6. Solution -「NOI 2018」「洛谷 P4768」归程

    \(\mathcal{Description}\)   Link.   给定一个 \(n\) 个点 \(m\) 条边的无向连通图,边形如 \((u,v,l,a)\).每次询问给出 \(u,p\),回答 ...

  7. Solution -「HNOI 2007」「洛谷 P3185」分裂游戏

    \(\mathcal{Description}\)   Link.   给定 \(n\) 堆石子,数量为 \(\{a_n\}\),双人博弈,每轮操作选定 \(i<j\le k\),使 \(a_i ...

  8. Solution -「ARC 104E」Random LIS

    \(\mathcal{Description}\)   Link.   给定整数序列 \(\{a_n\}\),对于整数序列 \(\{b_n\}\),\(b_i\) 在 \([1,a_i]\) 中等概率 ...

  9. Solution -「NOI 模拟赛」彩色挂饰

    \(\mathcal{Description}\)   给定一个含 \(n\) 个点 \(m\) 条边的简单无向图,设图中最大点双的大小为 \(s\),则保证 \(s\le6\).你将要用 \(k\) ...

  10. Solution -「NOI 模拟赛」出题人

    \(\mathcal{Description}\)   给定 \(\{a_n\}\),求一个 \(\{b_{n-1}\}\),使得 \(\forall x\in\{a_n\},\exists i,j\ ...

随机推荐

  1. RSA 加密解密

    from Crypto.Util.number import bytes_to_long, long_to_bytes, getPrime import libnum # 一.取两个素数 p = ge ...

  2. 【可视化大屏】用Python开发「淄博烧烤」微博热评舆情分析大屏

    目录 一.开发背景 二.爬虫代码 2.1 爬微博列表 2.2 爬微博评论 2.3 导入MySQL数据库 三.可视化代码 3.1 大标题 3.2 词云图(含:加载停用词) 3.3 玫瑰图(含:snown ...

  3. 如何批量修改 GitHub 代码提交作者

    批量修改 GitHub 代码提交作者需要进行以下步骤: 首先,你需要 clone 远程仓库到本地,使用以下命令: git clone <repository-url> ``` 将 `< ...

  4. 自然语言处理(NaturalLanguageProcessing,NLP)领域的100篇热门博客文章标题如下:

    目录 文章标题:<自然语言处理(Natural Language Processing,NLP)领域的100篇热门博客文章标题如下> 背景介绍: 随着人工智能技术的不断发展和普及,自然语言 ...

  5. 使用selenium、xpath、半自动点赞、自动登录

    selenium等待元素加载 # 程序执行速度很快--->获取标签--->标签还没加载好--->直接去拿会报错 # 显示等待:当你要找一个标签的时候,给它单独加等待时间 # 隐士等待 ...

  6. 现代C++(Modern C++)基本用法实践:三、移动语义

    概述 移动 移动(move)语义C++引入了一种新的内存优化,以避免不必要的拷贝.在构造或者赋值的时候,如果实参是右值(或者左值由std::move转换成右值),便会匹配移动语义的函数调用如下述举例的 ...

  7. Redis的设计与实现-总结

    个人真的很喜欢这本书, 从对C语言一窍不通, 到发现C语言竟然如此简洁, 以至于我喜欢上了C! 对此前面的底层数据结构也读了几次, 大致整理了书里的内容, 后面的就粗略看了一下, 不再细细整理了. R ...

  8. 2021-10-08 Core的LaunchSettings文件说明

    { "iisSettings": { //是否以IIS Express启动 "windowsAuthentication": false, //是否启用wind ...

  9. Go的函数定义

    格式: 1 func function_name( [parameter list] ) [return_types] { 2 函数体 3 } 注释: func:函数由 func 开始声明 funct ...

  10. Vue笔记(一)

    1. Vue.js是什么? 1). 一位华裔前Google工程师(尤雨溪)开发的前端js库 2). 作用: 动态构建用户界面 3). 特点: * 遵循MVVM模式 * 编码简洁, 体积小, 运行效率高 ...