竞赛讨论区 > C题为啥过不了?
头像
大佬求放过嘤嘤嘤
发布于 02-08 18:25 湖南
+ 关注

C题为啥过不了?

void solve(){
	ll n, x, y;
    string a, b, c;
    cin >> n >> x >> y >> a >> b >> c;
    vector<ll> aunmatch1pos, aunmatch0pos;
    vector<ll> bunmatch1pos, bunmatch0pos;
    
    ll unmatched = 0, matched = 0;
    for(ll i = 0; i < n; i++){
        if( ((a[i]-'0')^(b[i]-'0')) == (c[i]-'0') ){
            matched ++;
        }
        else{
            if(a[i] == '1')
            aunmatch1pos.push_back(i);
            else
            aunmatch0pos.push_back(i);
            if(b[i] == '1')
            bunmatch1pos.push_back(i);
            else
            bunmatch0pos.push_back(i);
            unmatched ++;
        }
    }
    // a和b可能会是 00 01 10 11
    // 但a和b异或只会有两种结果
    // 即 0 或 1
    // 00和11的结果相同, 10和01也相同
    // 如果答案不匹配,修改任意一个(a或b)都可以得到正确答案
    ll ans1 = unmatched * x;// 只反置的方案
    
    // 交换的话,需要i和j位上都不匹配并且a[i]!=a[j]
    ll mi = min(aunmatch1pos.size(),aunmatch0pos.size());
    ll mx = max(aunmatch1pos.size(),aunmatch0pos.size());
    ll ans2 = mi*y + (mx-mi)*x;// 交换a,剩下的反制
    
    mi = min(bunmatch1pos.size(),bunmatch0pos.size());
    mx = max(bunmatch1pos.size(),bunmatch0pos.size());
    ll ans3 = mi*y + (mx-mi)*x;// 交换b,剩下的反制
    
    cout << min({ans1, ans2, ans3}) << endl;
}

全部评论

(1) 回帖
加载中...
话题 回帖

等你来战

查看全部

热门推荐