1 条题解
-
0
F. 基里尔与蘑菇 详细题解
题目核心理解
有 个蘑菇,第 个蘑菇的魔力值为 。 基里尔可以选择 个蘑菇来炼制强度最大的药剂:
- 若选 个蘑菇,则排列 中前 个位置对应的蘑菇魔力值会变为 ,不能使用。
- 药剂强度 = 所选蘑菇个数 × 这些蘑菇中的最小魔力值。
- 在所有能达到最大强度的方案中,要求使用蘑菇数量 尽可能小。
核心思路
1. 关键观察
- 对每个 ,能使用的蘑菇是:没被清零且魔力值最大的 个。
- 强度等价于: 这 个蘑菇里魔力值最小的那一个。
- 随着 增大,会新增一个蘑菇()被强制清零,我们只需要动态维护当前可用的最大蘑菇集合。
2. 贪心策略
- 将所有蘑菇按魔力值从大到小排序。
- 从小到大枚举 (使用蘑菇数量):
- 每次 增加,把 位置的蘑菇标记为不可用(清零)。
- 用一个指针 不断向后取未清零、未被选过的最大蘑菇,直到凑齐 个。
- 对每个合法 计算强度,维护最大强度和对应的最小 。
算法流程
- 读入 、数组 和排列 。
- 把蘑菇按(魔力值,下标)降序存入列表并排序。
- 维护两个布尔数组:
- :下标 的蘑菇是否被清零。
- :下标 的蘑菇是否已被选中。
- 用指针 从最大魔力值开始遍历,枚举 到 :
- 标记 为 。
- 跳过所有不可用蘑菇,找到第 个可用蘑菇。
- 用当前最小魔力值计算强度。
- 更新最大强度和最优 。
- 输出最大强度和对应的最小蘑菇数量。
公式与复杂度分析
对每个 ,强度计算公式:
$$strength = k \times \min(\text{前 }k\text{ 大的可用蘑菇魔力值}) $$复杂度
- 排序:
- 线性枚举 + 指针遍历:
- 总时间复杂度:
可完美处理 、多组数据总和限制。
- 1
信息
- ID
- 6538
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者