1 条题解

  • 0
    @ 2026-4-15 21:51:11

    F. 基里尔与蘑菇 详细题解

    题目核心理解

    nn 个蘑菇,第 ii 个蘑菇的魔力值为 viv_i。 基里尔可以选择 kk 个蘑菇来炼制强度最大的药剂:

    • 若选 kk 个蘑菇,则排列 pp 中前 k1k-1 个位置对应的蘑菇魔力值会变为 00不能使用
    • 药剂强度 = 所选蘑菇个数 × 这些蘑菇中的最小魔力值
    • 在所有能达到最大强度的方案中,要求使用蘑菇数量 kk 尽可能小

    核心思路

    1. 关键观察

    • 对每个 kk,能使用的蘑菇是:没被清零魔力值最大的 kk
    • 强度等价于:k×k \timeskk 个蘑菇里魔力值最小的那一个
    • 随着 kk 增大,会新增一个蘑菇(pkp_k)被强制清零,我们只需要动态维护当前可用的最大蘑菇集合。

    2. 贪心策略

    1. 将所有蘑菇按魔力值从大到小排序。
    2. 从小到大枚举 kk(使用蘑菇数量):
      • 每次 kk 增加,把 pk1p_{k-1} 位置的蘑菇标记为不可用(清零)
      • 用一个指针 jj 不断向后取未清零、未被选过的最大蘑菇,直到凑齐 kk 个。
    3. 对每个合法 kk 计算强度,维护最大强度对应的最小 kk

    算法流程

    1. 读入 nn、数组 vv 和排列 pp
    2. 把蘑菇按(魔力值,下标)降序存入列表并排序。
    3. 维护两个布尔数组:
      • zero[i]zero[i]:下标 ii 的蘑菇是否被清零。
      • used[i]used[i]:下标 ii 的蘑菇是否已被选中。
    4. 用指针 jj 从最大魔力值开始遍历,枚举 k=1k=1nn
      • 标记 pk1p_{k-1}zerozero
      • 跳过所有不可用蘑菇,找到第 kk 个可用蘑菇。
      • 用当前最小魔力值计算强度。
      • 更新最大强度和最优 kk
    5. 输出最大强度和对应的最小蘑菇数量。

    公式与复杂度分析

    对每个 kk,强度计算公式:

    $$strength = k \times \min(\text{前 }k\text{ 大的可用蘑菇魔力值}) $$

    复杂度

    • 排序:O(nlogn)O(n\log n)
    • 线性枚举 + 指针遍历:O(n)O(n)
    • 总时间复杂度:O(nlogn)O(n\log n)

    可完美处理 n2×105n\le 2\times10^5、多组数据总和限制。

    • 1

    信息

    ID
    6538
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者