はまやんはまやんはまやん

hamayanhamayan's blog

Equalize [Manthan, Codefest 18 C]

http://codeforces.com/contest/1037/problem/C

2進数表記されたN桁の数A,Bがある。
Aに対して以下の操作を行ってBにするための最小コストは?

  • iビット目とjビット目をswapする(必要コストabs(i - j))
  • iビット目のビットを反転させる(必要コスト1)

解法

http://codeforces.com/contest/1037/submission/42452744

swapについてであるが、2<abs(i-j)であれば、反転操作で代用したほうがコストが小さくて済む。
そのため、上の操作は「iビット目とi+1ビット目をswapする(必要コスト1)」と置き換える。
 
ここからは貪欲に操作を考える。
swapすることで隣り合う要素がどちらともBと等しくなるならば、貪欲にしたほうがいい。
それができないならば、反転させるしかない。
 
最初にswap操作をして、あとで、まだ違うAの要素を反転でBに合わせていく。

int N; string A, B;
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> N >> A >> B;

    int ans = 0;
    rep(i, 0, N - 1) {
        if (A[i] != B[i] and A[i + 1] != B[i + 1] and A[i] != A[i + 1]) {
            ans++;
            swap(A[i], A[i + 1]);
        }
    }
    rep(i, 0, N) if (A[i] != B[i]) ans++;
    cout << ans << endl;
}