Bootstrap

第 26 场 蓝桥入门赛

2.对联【算法赛】 - 蓝桥云课

问题描述

大年三十,小蓝和爷爷一起贴对联。爷爷拿出了两副对联,每副对联都由 N 个“福”字组成,每个“福”字要么是正的(用 1 表示),要么是倒的(用 0 表示)。

爷爷说:“小蓝啊,这两副对联可以随意调整‘福’字的顺序。我们要让上下联的‘福’字对应位置的‘福气值’达到最大。‘福气值’的计算方法是:正正相对得 0,正倒相对得 1,倒正相对得 1,倒倒相对得 0。”

小蓝挠了挠头:“爷爷,这不就是二进制异或运算吗?”

爷爷笑着点点头:“没错!现在给你两串‘福’字的初始排列,你能算出通过最优调整后,最大的总福气值是多少吗?你只需要告诉爷爷最大的总福气值在二进制情况下 1 的个数即可。”

小蓝感觉略微有点困难,于是请你帮忙解决这个问题。

输入格式

第一行输入一个整数 N(1≤N≤1e3),表示每幅对联中“福”的数量。

第二行输入一个长度为 N 的 01 字符串 S 表示第一幅对联的初始排列。

第三行输入一个长度为 N 的 01 字符串 T 表示第二幅对联的初始排列。

输出格式

输出一个整数表示答案。

样例输入

4
0011
1011

样例输出

3

思路:

以最多的0对应最多的1.

代码如下:

#include <iostream>
#include<string> 
using namespace std;
int main()
{
  string s1,s2;
  int n,zero_f = 0,zero_s = 0,one_f = 0,one_s = 0;
  cin >> n >> s1 >> s2;
  for(int i = 0 ; i < s1.size() ; i++)
  {
  	if(s1[i] == '1')
  	zero_f++;
  	if(s1[i] == '0')
  	one_f++;
  }
  for(int i = 0 ; i < s2.size() ; i++)
  {
  		if(s2[i] == '1')
	  	zero_s++;
	  	if(s2[i] == '0')
	  	one_s++;
  }
 // cout << zero_f << " " <<  one_f << endl;
 // cout << zero_s << " " <<  one_s << endl;
  int cnt = 0;
  cnt = min(zero_f,one_s) + min(zero_s,one_f);
  cout << cnt;
  return 0;
}

;