1 条题解
-
0
题目理解
我们有一个长度为 的二进制字符串 和一个参数 。游戏规则是:
- 我们选择一些位置进行保护。
- Teto 从左到右扫描每个位置 ,如果满足以下三个条件,她可以将 从 改为 :
- 该位置没有被保护
- 前面 个位置(即 到 )中没有
目标:选择最少的位置进行保护,使得 Teto 无法改变任何字符(即所有 都保持不变)。
关键观察
-
保护第一个 是必要的
如果字符串的第一个 没有被保护,且它前面没有 (因为它是第一个),那么 Teto 就可以将它改为 。
所以,第一个 必须被保护。 -
保护某些 可以阻止后续的 被改变
规则中说:如果前面 个位置中存在 ,则当前 不能被 Teto 改变。
因此,如果我们确保每个 的前面 个位置内至少有一个被保护的 ,那么它就不会被 Teto 改变。 -
只需要保护部分 ,而不是所有
我们可以让某些 承担“保护”后续 的任务:
如果一个被保护的 后面 个位置内出现了另一个 ,那么这个 不需要被保护,因为它前面有被保护的 。 -
转化问题
我们只需要保护一些 ,使得:- 第一个 被保护;
- 任意两个被保护的 之间的距离小于 (因为如果距离 ,中间会出现一个 前面没有被保护的 ,它会被 Teto 改变)。
贪心策略
设所有 的位置为 (下标从 开始,表示在字符串中的索引)。
- 第一个 必须被保护,即 被保护。
- 从 开始往后看:如果 ,说明 的前面 个位置内没有被保护的 ,那么 必须被保护。
- 依此类推:我们维护最后一个被保护的 的位置 ,遍历所有 ,如果当前 的位置 满足 ,则保护它(答案加 ),并更新 。
算法步骤
- 初始化 (或者一个足够小的数,如 )。
- 遍历字符串 的所有位置 :
- 如果 且 ,则 ,并更新 。
- 输出 。
示例验证
示例 1:
- ,, 成立,,。
- ,,,不成立,不保护。
- 输出 ,正确。
示例 4:
的位置:
- 被保护,
- ,,保护,,
- ,,保护,,
- ,,保护,,
输出 ,正确。
示例 9:
没有 ,循环不执行任何保护,,正确。
时间复杂度
- 遍历一次字符串,。
- 总 不超过 ,完全可行。
正确性证明(归纳法)
归纳假设:按上述贪心策略保护的 的集合,能够使得所有 在游戏过程中保持不变。
- 基础:第一个 被保护,不会被改变。
- 归纳步:假设某个被保护的 在位置 之前的所有 都保持不变。
对于下一个 在位置 :- 如果 ,那么 的前面 个位置中包含被保护的 ,所以 Teto 无法改变 。
- 如果 ,则 的“保护范围”无法覆盖 ,因此 必须被保护,否则它前面 个位置没有 ,Teto 可以改变它。
由于我们正是这样决定保护的,所以所有 最终都会处于被保护或被覆盖的状态,字符串保持不变。同时,这种策略显然是最优的,因为我们只在必要时才增加保护。
总结
本题的核心是将问题转化为:在 的位置序列中,如果相邻 的距离 ,则必须保护后一个 。
贪心地从左到右扫描即可得到最少保护数。
- 1
信息
- ID
- 6215
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者