1 条题解
-
0
思路
这是一道构造题:每个位置都必须按顺序输出一次
2或3,且要求最后 A、B 两个集合中状态为 的元素个数相等。令 ,按位置固定输出:
- 前 个位置输出
2(加入集合 A 并翻转该位); - 后 个位置输出
3(加入集合 B 不翻转)。
证明它对任意翻转方案都成立。 记系统在前 个位置中翻转了 个(系统总共恰好翻转 个位置):
- 前 个位置原本都是 。被系统翻过的 个变成 ,其余 个仍是 。我们对这些位置执行
2,即全部翻转一次再放入 A:原来的 个 变回 ,剩下的 个 变成 。所以 A 中状态为 的元素有 个。 - 后 个位置中被系统翻过的有 个,剩下 个没被翻、状态仍为 。我们对这些位置执行
3,放入 B 且不翻转。所以 B 中状态为 的元素也有 个。
两个集合中状态为 的元素数恒等于 ,条件对任意翻转方案都成立,因此永远不需要输出 。
边界: 时全部输出
2(A 中为 的个数仍是 ,B 为空、为 ,此时 ); 时全部输出3,两种构造同样成立。直接按位置输出即可。
复杂度: 时间 ,空间 (除输出外不额外存储)。
代码
#include <bits/stdc++.h> #define endl '\n' using namespace std; using i64 = long long; void solve() { int n,k,i;cin>>n>>k; // 前 n-k 个位置选 "2":加入集合 A 并翻转 for(i=1;i<=n-k;i++){ cout<<2; } // 后 k 个位置选 "3":加入集合 B 且不翻转 for(;i<=n;i++){ cout<<3; // 按位置连续输出,不加空格 } } signed main() { ios::sync_with_stdio(0); cin.tie(0); int _ = 1; // 本题只有单组数据 while (_--) { solve(); } return 0; } - 前 个位置输出
- 1
信息
- ID
- 22
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者