1 条题解
-
0
CF1988A Split the Multiset 题解
题意简述
初始多重集 ,每次操作可以:
- 选择 中的一个正整数 ;
- 移除它的一个副本;
- 向 中插入 不超过 个正整数,它们的和等于 。
求使 中恰包含 个 所需的最小操作次数。
,。
核心思路
每次操作相当于把一个大数“分裂”成若干小数,且分裂出的数的个数不超过 。
初始时集合中只有 个元素,最终我们需要 个元素(全部是 )。
一次操作最多可以把 个元素变成 个元素,因此每操作一次,元素总数最多增加 。要从 个元素变成 个元素,至少需要操作
次。这就是所需答案的下界。
构造方案(证明下界可达)
我们可以采用如下贪心策略:
- 每次选取当前集合中最大的数 (且 )。
- 若 ,将其分裂为 个数:。
- 若 ,则将其直接分裂为 个 (此时不再有大于 的数,过程结束)。
这样,每次操作(除最后一次外)都会恰好产生 个新的 ,同时保留一个剩余的大数供后续处理。最终,当剩余的那个数小于 时,最后一次操作将其全部变成 。
因此,总操作次数恰好为 ,达到下界。
答案公式
- 当 时,答案为 。
- 否则答案为 。
在整数运算中可写成
(n - 1 + k - 2) / (k - 1)或直接使用ceil。
复杂度分析
- 时间复杂度: 每组数据。
- 空间复杂度:。
参考代码
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int t; cin >> t; while (t--) { int n, k; cin >> n >> k; if (n == 1) { cout << "0\n"; } else { cout << (n - 1 + k - 2) / (k - 1) << '\n'; } } return 0; }
- 1
信息
- ID
- 6819
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者