货币兑换

首先这道题目,记得把题面看完,最后一句话是给了提示的。。。

肯定考虑DP嘛,但DP不太清楚怎么设置状态,而且不清楚一天到底交易多少次

我们先来解决第二个问题,由于这是一道可以被解决的题目,所以我们猜想交易的次数非常有限

根据题目最后的提示,某一天的开端,我们要么全部都是钱,要么全部都是股票

假设某一天的开端,我们全部都是钱,一共有\(IP\)这么多钱,那么我们可以选择不操作;如果选择操作,那么一定是全部买完。通过列方程不难得出,获得的股票\(B\)的数量是\(x_B=\frac{IP}{A_kRate_k+b_k}\),获得的股票\(A\)的数量是\(x_A=Rate_k\times x_B=\frac{Rate_kIP}{A_kRate_k+b_k}\)。如果我们选择再全部卖出,那么获得的钱为\(x_AA_k+x_BB_k=IP\),与最开始的钱是一样的。综上,我们要么不操作,要么只操作一次,把所有钱都换成股票

假设某一天的开端,我们全部都是股票,假设有两种股票分别有\(x_A\)\(x_B\)这么多,我们可以选择不操作;如果操作,我们获得的钱是\(x_AA_k+x_BB_k\),如果再全部买回来,我们有\(x_B^{'}=\frac{x_AA_k+x_BB_k}{A_kRate_k+b_k}\)\(x_A=Rate_k\times x_B=\frac{Rate_k(x_AA_k+x_BB_k)}{A_kRate_k+b_k}\),发现跟最开始长得好像不一样,别慌,继续卖,我们发现又会获得相同的钱\(x_AA_k+x_BB_k\)。综上,我们要么不操作,要么操作一次全部卖出变成钱,要么操作两次变成比例不一样的股票(其实全变成钱之后就回到了上面一段所叙述的情况了)

但发现到这里还是没有什么办法DP,我们只是把每一天的操作局限在了两次以内,这个时候我们就先设置\(f[i]\)表示第\(i\)天能够获得的最多的钱,然后考虑如何DP下去

我们考虑当达到第\(i\)天的开始的时候,我们一定是要么全是钱,要么全是股票

对于第一种情况,有\(f[i]=f[i-1]\)(注意我们状态设置的是最多有多少钱,所以在第\(i\)天结束时,一定会全部转换成钱)

对于第二种情况,我们考虑这些股票是在什么时候交易过来的,也就是说上一次把所有钱变成股票是什么时候。我们枚举这个时候,假设这个时候是第\(j\)天,那么有\(f[i]=x_jA_i+y_jB_i\),其中\(y_j=\frac{f[j]}{A_jRate_j+B_j},x_j=Rate_jy_j\)

出现了\(i\)\(j\)的乘积,感觉是斜率优化,但是又跟一般的斜率优化,不太一样,因为有两项乘积,别怕,我们这个时候随便提出某一项跟\(i\)有关的常量(注意一定要提取跟\(i\)有关的,因为当\(i\)固定的时候,这是常量),有\(f[i]=B_i(x_j\frac{A_i}{B_i}+y_j)\),这个时候就是普通的斜率优化了,我们用李超线段树即可。但要注意这里的\(\frac{A_i}{B_i}\)是实数,我们需要先离散化

其实最开始那一大堆数学分析看起来并没有什么用,然而他可以帮助我们理解整个过程,而且蕴含的思想(一天不会交易很多次)在有些题目也是很重要的

update 2024.7.6

其实我们很想设出我们当前手上的券的数目,然而我们发现显然复杂度会爆炸,所以上面枚举的策略也是一种解决方法

posted @ 2024-03-03 22:26  最爱丁珰  阅读(1)  评论(0编辑  收藏  举报