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;
}
posted @ 2024-01-21 14:13  Xu_dh  阅读(22)  评论(0)    收藏  举报