【比赛】【SMOJ 2019.3.31】

\(\mathrm{T1}\)

首先可以发现:每次游戏最后都会在一个地方不停打转。

所以我们只需要 枚举最后在哪个区间打转(这个可以直接维护一个最大连续子序列和) 即可。

接着我们开两个数组:\(val(i)\)表示到第\(i\)个位置时所积累下的最大积分;\(step(i)\)表示到第\(i\)个位置所需要用的最少步数。

然后对于第\(i\)个位置,我们就可以枚举上一个位置\(j\),用来计算\(val(i)\)\(step(i)\)

但这里要插入一下:我们要在一开始预处理一部分\(step(i)\)。如果从第\(1\)个位置可以直接走到第\(i\)个位置,那么就可以直接让\(step(i)=1\)。而且以后也不再需要计算\(step(i)\)了。(因为这样算出来的\(step(i)\)就是最短的了。)

如果一开始\(step(i) \ne 1\),那就说明不能从第\(1\)个位置直接到第\(i\)个位置,我们给\(step(i)\)赋一个极大值,再枚举能跳到\(i\)这个位置但是需要多跳几轮攒积分的上一个位置\(j\)

那么,从\(j\)\(i\)需要花费的步数就是:

\[\left\lceil \frac{-( sum_i-sum_j )-val_j}{2\times gsum_j} \right\rceil \times 2 \]

看上面,首先我们肯定要确保\(gsum_j>0\),否则你在\(j\)这个位置滚是没有前途的滚不到\(i\)这个位置的。

然后如果\(sum_i-sum_j>0\),上面的式子会得到一个负数,这样的情况我们是不考虑的,因为既然\(sum_i-sum_j>0\),那你就不需要在\(j\)这个位置再滚了,直接跳过去就好了嘛。

然后,如果花费的步数大于题目要求的最大步数\(k\)的话,也不需要考虑。

最后,自己分析一下就知道\(gsum_j\)一定要累加偶数次,所以上面才要用\(ceil\)乱搞。

接着我们就看一下:

  • 如果\(step(j)+\text{花费的步数}<step(i)\)

    就更新\(step(i)=step(j)+\text{花费的步数}\),再更新\(val_i=val_j+gsum_j \times \text{花费的步数}+(sum_i-sum_j)\)

  • 如果\(step(j)+\text{花费的步数}=step(i)\)

    就只更新\(val_i=\min\{val_i\ ,\ val_j+gsum_j \times \text{花费的步数}+(sum_i-sum_j)\}\)

\(step\)在更新时是优先于\(val\)的,因为我们要保证在当前位置滚的次数最多(就是说,总是假装当前位置的\(gsum\)是最大的),所以就要先保证\(step(i)\)最小,再保证\(val(i)\)最大。

搞完上面这些乱七八糟的东西之后,最终答案就是

\[\max\limits_{1 \leqslant i \leqslant n}\{ val_i + (k-step(i)) \times gsum_i \} \]

\(\mathrm{Code}\)


\(\mathrm{T2}\)

很迷的一道贪心。

大体就是够钱了就买,一直买,如果买了比不买不划算或者在不买的情况下就可以一步搞定就停止购买(就是直接退出循环

\(\mathrm{Code}\)


\(\mathrm{T3}\)

很水的一道期望\(\mathrm{DP}\)

\(f(S)\)表示当前已经摸到了的彩球的集合为\(S\)的期望摸的次数。

然后预处理一下下一步摸到的球是哪种球即可,转移方程很简单。

结果出现频率那个梗真的不想吐槽……原来还要把所有频率加起来

\(\mathrm{Code}\)

posted @ 2019-08-01 11:25  info___tion  阅读(98)  评论(0编辑  收藏  举报