有两种操作,第一种代价 \(x\),第二种 \(y\)。在不能连续进行 \(1\) 操作 \(k\) 次的情况下,问至少需要多少代价才能打出至少 \(z\) 点伤害。
- 使攻击力 \(d\) 加 \(1\)(初始为 \(0\))。
- 打出 \(d\) 点伤害。
\(1 \le x, y, z, k \le 10^8\),\(100\) 组数据。
有一个很显然的贪心,尽量先第一种再第二种。所以一定是进行 \(c\) 轮 \('k + 1'\) 模式后,再升级 \(r(0 \le r < k)\) 次,最后还需打 \(p\) 次伤害。
可以枚举 \(c, r\),计算 \(p_{min}\)。因为 \(c\) 是 \(\sqrt{\frac{z}{k}}\) 级别,所以时间复杂度是 \(O(\sqrt {zk})\)。
然后发现对于每种 \(c\) 都可以整除分块,只有 \(O(\sqrt k)\) 种 \(p_{min}\),时间复杂度降为 \(O(\sqrt z + \sqrt k)\),足以通过。
最开始以为有什么凸性之类的,写了个二分套三分,然后发现不对,\(10^8\) 的范围还是指向根号级做法。
不小心对 \(p\) 整除分块了(有很多种 \(c_{min}\)),搞了挺久的。
当有多种选择时要仔细分辨,不要盲目随机选择。