1 条题解
-
0
L2174. 「FJOI2016」神秘数 - 完整题解
题目描述
给定一个长度为 的序列 ,有 个询问。对于每个询问 ,考虑由 构成的可重复数字集合,求这个集合的神秘数——即最小的不能被该集合的某个子集的和表示的正整数。
数据范围:
核心思路分析
-
问题转化 我们需要快速求出区间 中数字组成集合的神秘数。直接枚举所有子集显然不可行。
-
关键观察 设当前已经能够表示出 中的所有整数,考虑下一步:
情况1:如果集合中存在某个数
那么我们可以用 加上 中的某些数,表示出
由于 ,区间 和 会合并成
新的表示范围变为 ,其中
情况2:如果集合中所有数都
那么 无法被表示
答案就是
- 贪心算法 扩展上面的思路:不是只加一个 的数,而是一次性加入所有 的数。
算法流程:
text 初始化 R = 0 循环: 设 S = 区间内所有 ≤ (R+1) 的数的和 如果 S > R: R = S # 能表示的范围扩展到 [1, S] 否则: 输出 R+1 作为答案 结束循环 正确性证明:
设当前能表示 ,令
查询所有 的数的和
如果 :说明没有新的数可以加入, 无法表示
如果 :设新增的数为 (都 )
对于每个 ,由于 ,且已能表示
可以表示 ,这些区间会合并成
因此更新后能表示
- 复杂度分析 设最终答案为 :
每次循环中,新的 至少是原来的 加上某个 的数
实际上 的增长速度很快(类似倍增)
循环次数为 ,通常不超过 40 次
-
- 1
信息
- ID
- 5957
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者