1 条题解
-
0
A. Dora 的集合 详细题解
问题重述
给定区间 ,初始集合包含该区间内所有整数。每次操作选择三个互不相同的数 ,要求它们两两互质(),然后将它们从集合中移除。求最大操作次数。
关键观察
观察 1:奇偶性限制
在一组 中,至少有两个奇数,至多一个偶数。
证明:如果同时出现两个偶数,它们的最大公约数至少为 ,不满足互质条件。因此,任何有效操作中,偶数个数 ,奇数个数 。
观察 2:最优策略
为了最大化操作次数,应该充分利用奇数。理想情况下,每次操作使用两个奇数和一个偶数。
观察 3:构造可行解
考虑三个连续整数:
- 和 是两个连续的奇数,它们互质(相邻奇数差为 ,但最大公约数仍为 )
- 和 是连续整数,
- 和 是连续整数,
因此,这样的三元组总是可行的。
观察 4:答案公式
每次操作消耗 个奇数和 个偶数。由于偶数可能不够,答案受限于奇数的数量。
设区间 中奇数的个数为 ,则最大操作次数为:
因为每次操作需要 个奇数。
观察 5:奇数个数的计算
区间 中奇数的个数为:
$$odd = \left\lfloor \frac{r+1}{2} \right\rfloor - \left\lfloor \frac{l}{2} \right\rfloor $$因此答案为:
$$\text{ans} = \left\lfloor \frac{\left\lfloor \frac{r+1}{2} \right\rfloor - \left\lfloor \frac{l}{2} \right\rfloor}{2} \right\rfloor $$时间复杂度
- 每个测试用例
- 总复杂度
完整代码
#include <bits/stdc++.h> using namespace std; int main() { ios_base::sync_with_stdio(false); cin.tie(0); int t; cin >> t; while (t--) { int l, r; cin >> l >> r; // 计算区间内奇数的个数 int odd = (r + 1) / 2 - l / 2; // 每次操作需要 2 个奇数 int ans = odd / 2; cout << ans << "\n"; } return 0; }代码说明
-
奇数个数计算:
(r + 1) / 2: 到 中奇数的个数l / 2: 到 中奇数的个数- 相减得到 中奇数的个数
-
答案计算:
- 每次操作消耗 个奇数
- 最大操作次数 = 奇数个数除以 向下取整
示例验证
测试用例 奇数个数 答案 → 个 → 个 → 个 → 个 → 个 → 个 → 个 个 与样例输出完全一致。
总结
本题的核心技巧:
- 发现操作中必须包含至少两个奇数
- 构造连续整数三元组 证明可行性
- 答案仅取决于区间内奇数的个数
- 时间解决,无需模拟
- 1
信息
- ID
- 6322
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者