2021-07-13 AcWing 3764. 三元数异或

输入样例:

4
5
22222
5
21211
1
2
9
220222021

输出样例:

11111
11111
11000
10211
1
1
110111011
110111010

 

解析:

贪心+模拟 

既然要求max(a,b)最小,所以分配时优先均匀分配 

 x=0   =>   a=0,b=0

 x=1   =>   a,b = 0,1

 x=2   =>   a,b = 1,1  /  0,2

这样会导致两个数不等,因为我们需要 max(a,b)尽可能小,所以在第一次不均匀分配时将较大的数分配给 a,这样无论之后如何分配,都能保证 a>b

为了使两者中的最大值(即a)保持不变,此后每当遇到不均匀分配的情况,均将所有较大的数分配给 b

#include<iostream>
using namespace std;

int main()
{
    int N,n;
    cin>>N;
    while(N--)
    {
        string a="",b="";
        string s;
        bool flag=false;//是否有过不平均分配

        cin>>n;
        cin>>s;
        for(auto x:s){
            if(x=='2'){
                if(flag){
                    a += '0';
                    b += '2';
                }else{
                    a += '1';
                    b += '1';
                }
            }else if(x=='1'){
                if(flag){
                    a += '0';
                    b += '1';
                }else{
                    a += '1';
                    b += '0';
                    flag = true;
                }
            }else{
                a += '0';
                b += '0';
            }
        }
        cout<<a<<endl<<b<<endl;
    }
    
    return 0;
}

posted @ 2021-07-13 20:38  泥烟  阅读(19)  评论(0编辑  收藏  举报