[ABC303F] Damage over Time

[ABC303F] Damage over Time

我们定义一个技能 \(i\) 能够造成 \(d_i\times t_i\) 的伤害称伤害是满的,如果不能称是有浪费的。

如果不知道次数是无法知道某个技能造成的伤害到底是满的还是有浪费的,所以果断二分答案。

假设二分出来需要 \(mid\) 回合

则最多造成的伤害是 \(\sum_{i=1}^{mid}\max(\min(t_j,i)\times d_j)\)

以样例二进行研究,\(N=10,H=200\)

1 21
1 1
1 1
8 4
30 1
3 1
10 2
8 1
9 1
4 4

按照 \(t_i\times d_i\) 从大到小排序。

8 4
30 1
1 21
10 2
4 4
9 1
8 1
3 1
1 1
1 1

然后我们可以发现一个很显然的性质:如果对于两个技能 \(i,j\),满足 \(t_i\times d_i\ge t_j\times d_j\),且 \(t_i\le t_j\) 或者 \(d_i\ge d_j\),那么 \(j\) 就没有存在的必要了。比如 \((8,4),(30,1)\),前者不仅攻击周期短,而且总伤害高,后者就没有用了。所以进一步精简。

8 4
1 21

发现只有两种技能在最优的情况下可能被使用。设 \(8,4\) 为一技能,\(1,21\) 为二技能。

假设 \(mid=31\)。那么在 \([1,24]\) 回合放技能一都可以做到满的伤害。

当然答案是 \(9\),所以我们研究答案是 \(9\) 时的情况。

1 2 3 4 5 6 7 8 9
放一:4 4 4 4 4 4 4 4
放一:4 4 4 4 4 4 4 4
放一:4 4 4 4 4 4 4
放一:4 4 4 4 4 4
放二:21 放二:21 放二:21 放二:21 放二:21

\(32+32+28+24+5*21=221>200\)

可以发现在第五次时,由于后面时间不够,技能一的贡献变为 \(5\times 4=20<21\),放技能2更优了。

我们可以通过计算得出这个分水岭。

\[xd_i<t_jd_j \]

\[x<t_jd_j\div d_i \]

分水岭就是这里了。

然后从小到大做就是了。

但是需要注意如果 \(a[i+1].t>=mid\),那么 \(i\) 就没有必要算了,可能会出现负数。

但是我发现改成 \(x<\min(t_j,mid)d_j\div d_i\),虽然中途出现负数,但是答案正确。

有疑问的代码
保证正确的代码

posted @ 2023-06-12 12:37  wscqwq  阅读(56)  评论(0编辑  收藏  举报