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

hamayanhamayan's blog

ファッションへのこだわり [yukicoder No.717]

https://yukicoder.me/problems/no/717

考察過程

1. 最適な動きを考える
2. 上下とも無地に最大何回できるかを考えると、両者の無地の枚数の最小値であると言える
3. 柄付きも同様
4. 上下ともで無地と柄付きをそれぞれ数えて、最小値の和が答えになる

解法

https://yukicoder.me/submissions/275462

cntS[c] := Sでc=0なら無地、c=1なら柄付きの枚数
cntT[c] := Tでc=0なら無地、c=1なら柄付きの枚数
これをそれぞれ計算する。
 
cはS[i]-'A'で求まる。
これは'A'-'A'=0, 'B'-'A'=1であることを利用している。
今回の場合では特に必須な考え方では無いが、知っておくと構文解析などで役立つ場合がある。
 
あとは、無地の最小値、柄付きの最小値を求めて、総和を取ると答え。

int N, M;
string S, T;
int cntS[2], cntT[2];
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> N >> M >> S >> T;

    rep(i, 0, N) cntS[S[i] - 'A']++;
    rep(i, 0, M) cntT[T[i] - 'A']++;

    int ans = 0;
    ans += min(cntS[0], cntT[0]);
    ans += min(cntS[1], cntT[1]);
    cout << ans << endl;
}