1 条题解
-
0
解题思路
我们从左到右遍历 的各位数字。
- 如果当前位 是 或 ,我们可以设置 或 对应地(因为 ,,模 后符合要求)。没有更好的选择。
- 如果当前位 是 ,最优的选择是设 ,(这样 会在这一位大于 )。
一旦我们遇到了第一个 ,并按照上述方式分配,那么 就已经大于 (即使之后 的所有位都取 也无法反超)。因此,对于所有 ,我们直接设 , 即可,这样能保证 尽可能小。
如果没有遇到 (即 全由 和 组成),则我们始终可以设 ,这种情况也会被上述逻辑自动处理(因为永远不会触发 大于 的标记)。
#include <bits/stdc++.h> using namespace std; int main() { #ifdef _DEBUG freopen("input.txt", "r", stdin); // freopen("output.txt", "w", stdout); #endif int t; cin >> t; while (t--) { int n; string x; cin >> n >> x; string a(n, '0'), b(n, '0'); for (int i = 0; i < n; ++i) { if (x[i] == '1') { a[i] = '1'; b[i] = '0'; for (int j = i + 1; j < n; ++j) { b[j] = x[j]; } break; } else { a[i] = b[i] = '0' + (x[i] - '0') / 2; } } cout << a << endl << b << endl; } return 0; }
- 1
信息
- ID
- 6883
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者