CF2035E

有两种操作,第一种代价 \(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}\)),搞了挺久的。

当有多种选择时要仔细分辨,不要盲目随机选择

posted @ 2025-11-02 22:56  xiehanrui0817  阅读(10)  评论(0)    收藏  举报