Focus on yourself, m|

wscqwq

园龄:2年粉丝:2关注:3

[ABC303F] Damage over Time

[ABC303F] Damage over Time

我们定义一个技能 i 能够造成 di×ti 的伤害称伤害是满的,如果不能称是有浪费的。

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

假设二分出来需要 mid 回合

则最多造成的伤害是 i=1midmax(min(tj,i)×dj)

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

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

按照 ti×di 从大到小排序。

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

然后我们可以发现一个很显然的性质:如果对于两个技能 i,j,满足 ti×ditj×dj,且 titj 或者 didj,那么 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+521=221>200

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

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

xdi<tjdj

x<tjdj÷di

分水岭就是这里了。

然后从小到大做就是了。

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

但是我发现改成 x<min(tj,mid)dj÷di,虽然中途出现负数,但是答案正确。

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

本文作者:wscqwq

本文链接:https://www.cnblogs.com/wscqwq/p/17474729.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   wscqwq  阅读(100)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起