1 条题解

  • 0
    @ 2026-5-5 8:35:53

    解题思路

    我们从左到右遍历 xx 的各位数字。

    • 如果当前位 xix_i0022,我们可以设置 ai=bi=0a_i = b_i = 0ai=bi=1a_i = b_i = 1 对应地(因为 0+0=00+0=01+1=21+1=2,模 33 后符合要求)。没有更好的选择。
    • 如果当前位 xix_i11,最优的选择是设 ai=1a_i = 1bi=0b_i = 0(这样 aa 会在这一位大于 bb)。

    一旦我们遇到了第一个 11,并按照上述方式分配,那么 aa 就已经大于 bb(即使之后 bb 的所有位都取 22 也无法反超)。因此,对于所有 j>ij > i,我们直接设 aj=0a_j = 0bj=xjb_j = x_j 即可,这样能保证 max(a,b)\max(a,b) 尽可能小。

    如果没有遇到 11(即 xx 全由 0022 组成),则我们始终可以设 ai=bi=xi/2a_i = b_i = x_i / 2,这种情况也会被上述逻辑自动处理(因为永远不会触发 aa 大于 bb 的标记)。

    #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
    上传者