「刷题」可怜与STS

又是一道假期望,我们发现一共有$ C_{2n}^m $种情况。

而$ \frac{(2n)!}{m!(2n-m)!}=C_{2n}^m $

其实结果就是各个情况总伤害。

1.10分算法,爆搜10分。

2.30分算法,发现20%的攻击牌数值相同,这样先强化后攻击(至少留一张攻击牌)是最优策略。计算拿到$i$张强化牌,最小是第$j$张的情况下强化乘积和,乘上攻击牌的大小即可。

3.50分算法,发现20%的$m==k$,这样不用考虑出牌策略,先强化后攻击即可,分别计算拿到$i$张强化牌,最小是第$j$张的情况下的强化乘积和以及拿到$i$张攻击牌,最小是第j张的情况下的攻击和。两部分分别相乘即可。

4.$AC$算法,考虑最优策略的通解。发现每张强化牌至少会让所有的攻击牌数值翻倍,那么如果我选择只打最大的一张攻击牌的话,即使被一张最小的强化牌占据一张出牌机会,也能够让最大的一张翻倍,这样贡献要大于打一张最大的攻击牌和一张第二大的攻击牌。也就是说对于每个位置,最小的强化牌的贡献都要大于第二大的攻击牌,那么最优策略就是,只打最大的一张攻击牌,剩下的位置留给强化牌从大到小打,最后打出这张攻击牌,这样的伤害是最大的。

有了这个决策之后,我们不妨$sort$牌组。

设$f[i][j]$为强化牌选了$i$张,最后一张也是最小一张选的是第$j$张牌的乘积和,$g[i][j]$为攻击牌选了$i$张,最后一张也是最小的一张选的是第j张牌的攻击和,$a_i$是第$i$张强化牌,$b_i$是第$i$张攻击牌。

初始化:$f[0][0]=1$;

方程:

  $ f[i][j]=a_i\sum \limits_{k=1}^{j-1} f[i-1][k] $

  $ g[i][j]=b_i C_{j-1}^{i-1} \sum \limits_{k=1}^{j-1} g[i-1][k] $

组合数的意思是之前有这么多种情况($j-1$张牌中选$i-1$张牌,每种情况转移到$g[i][j]$中都需要加上一个$b_i$),前缀和优化,是$ O(n^2) $

设$F[i][j]$为选$i$张强化牌,打出$j$张强化牌的乘积和,$G[i][j]$为选$i$张攻击牌,打出$j$张攻击牌的伤害和。

方程:

  $ F[i][j]=\sum \limits_{k=j}^n f[j][k] C_{n-k}^{i-j} $

  $ G[i][j]=\sum \limits_{k=j}^n g[j][k] C_{n-k}^{i-j} $

组合数的意思是这j张牌是我打出去的大牌,那么剩下的$ i-j $张必定不如之前的$ j $张优,也就是小于$ k $,而小于k的牌一共有$ n-k $张。

这样发现是$ O(n^3) $的,时间上无法承受,在观察答案。

我们要求的:

    $ ans=\sum \limits_{i=0}^{min(m-1,n)} F[i][min(i,k-1)] G[m-i][max(1,k-i)] $

这是根据最优策略制定的,也就是说$i$张强化牌做多打出$k-1$张,而$m-i$张攻击牌最少要打出一张。

我们发现函数$F$和函数$G$都取单点值,所以只需要计算最多$m$个值。

那么$F$和$G$的计算复杂度仍然是$ O(n^2) $

总的时间复杂度:$ O(Tn^2) $

问题得解。

posted @ 2019-07-23 21:41  Lrefrain  阅读(155)  评论(4编辑  收藏  举报