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; }