D. XOR Permutations

D. XOR Permutations

image

注意

多次输入输出不要忘了初始化
注意分析

代码

点击查看代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<cctype>
using namespace std;

#define X first
#define Y second

typedef pair<int,int> pii;
typedef long long LL;
typedef struct ss{
	int cnt1,cnt0;
	string s;
}ss;
ss s[3];
const char nl = '\n';
const int N = 1e6+10;
const int M = 2e5+10;

bool cmp(ss a,ss b){
	return a.cnt1 > b.cnt1;
}

void solve(){
	int t;
	cin >> t;
	while(t -- ){
		cin >> s[0].s >> s[1].s >> s[2].s;
		s[0].cnt1 = 0;
		s[1].cnt1 = 0;
		s[2].cnt1 = 0;	//记得初始化
		for(int i = 0; i <= 9; i ++ ){
			if(s[0].s[i] == '1')s[0].cnt1 ++;
			if(s[1].s[i] == '1')s[1].cnt1 ++;
			if(s[2].s[i] == '1')s[2].cnt1 ++;            
		}
		s[0].cnt0 = 10 - s[0].cnt1;
		s[1].cnt0 = 10 - s[1].cnt1;
		s[2].cnt0 = 10 - s[2].cnt1;
		//结果取“1”的组合有“100”和"111"两种
		//如果希望“1”的个数尽可能地多,我们可以优先取“100”组合
		for(int i = 1; i <= 10; i ++ ){
			sort(s,s+3,cmp);	//每次都排序1数量最多的放前面
			if(s[0].cnt1 > 0 && s[1].cnt0 > 0 && s[2].cnt0 > 0){	//优先“100”组合
				s[0].cnt1 --;
				s[1].cnt0 --;
				s[2].cnt0 --;
				cout << "1";
			}
			else if(s[0].cnt1 > 0 && s[1].cnt1 > 0 && s[2].cnt1 > 0){	//其次"111"组合
				s[0].cnt1 --;
				s[1].cnt1 --;
				s[2].cnt1 --;
				cout << "1";
			}
			else cout << "0";
		}
		cout << nl;
	}
	

}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);

	solve();
}
posted @ 2023-03-15 18:28  Keith-  阅读(12)  评论(0编辑  收藏  举报