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

hamayanhamayan's blog

Table Tennis Training [AtCoder Grand Contest 041 A]

https://atcoder.jp/contests/agc041/tasks/agc041_a

解説

https://atcoder.jp/contests/agc041/submissions/9192722

まず、2人の友達は同時に動くため、互いに近づいて行っても、交わることができる場合とできない場合がある。
B-Aが偶数なら交わることができる。
このときにかかるラウンドは、(B-A)/2であり、これが答え。
B-Aが奇数のときは、片方が場所をずらす必要がある。
これは、Aが左端に移動して勝つか、Bが右端に移動して負けるかである。
すると、B-Aの偶奇が変化するので、両方試す。
自分の実装では、A,Bが端に到着したあとに互いに近づいて行くので、
端に移動させたら再帰的に自分を呼び出して偶数の計算をしている。

ll N, A, B;
//---------------------------------------------------------------------------------------------------
ll solve(ll a, ll b) {
    ll d = b - a;
    if (d % 2 == 0) return d / 2;

    ll ans = infl;

    // 最左へ
    chmin(ans, a + solve(1, b - a));

    // 最右へ
    chmin(ans, N - b + 1 + solve(a + (N - b + 1), N));

    return ans;
}
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> N >> A >> B;
    cout << solve(A, B) << endl;
}