CF1921B 题解
思路
显然,交换两个字符的操作比修改操作更优,所以尽量交换字符。
如果当前字符需要从 0 变为 1,那么它可以和一个需要从 1 变为 0 的字符交换。
设 \(cnt1\) 和 \(cnt2\) 分别为需要从 0 变为 1、需要从 1 变为 0 的字符个数。
可以先进行 \(\min(cnt1,cnt2)\) 次交换操作,再进行修改。
得出最终的答案就是 \(\min(cnt1,cnt2)\) 加上 \(cnt1\) 和 \(cnt2\) 分别减去 \(\min(cnt1,cnt2)\) 的值的和。
即 \(\min(cnt1,cnt2)+ cnt1-\min(cnt1,cnt2)+cnt2-\min(cnt1,cnt2)\)。
简化后就是 \(cnt1+cnt2-\min(cnt1,cnt2)\)。
AC CODE
#include<bits/stdc++.h>
using namespace std;
int main(){
int T;
cin>>T;
while(T--){
int n;
cin>>n;
string a,b;
cin>>a>>b;
int cnt1=0,cnt2=0;
for(int i=0;i<a.size();i++){
if(a[i]!=b[i]){
cnt1+=(a[i]=='0');
cnt2+=(a[i]=='1');
}
}
cout<<cnt1+cnt2-min(cnt1,cnt2)<<endl;
}
return 0;
}