Codeforces, Good Bye 2018: A. New Year and the Christmas Ornament

Problem - A - Codeforces

クリスマスツリーに3色の飾りを付けたい.
このとき,青色の飾りは黄色の飾りよりも1つ多く使い
赤色の飾りは青色の飾りよりも1つ多く使うという制約が課されている.

黄色の飾りが y 個,青色の飾りが b 個,赤色の飾りが r 個与えられたとき,
上記のルールに従って使える飾りの数の合計の最大値を求めたい.

求めたい数を ans とおき,そのときの黄色・青色・赤色の飾りの数をそれぞれ  \hat{y}, \hat{b}, \hat{r} とする.
題意を満たすときの  \hat{y}, \hat{b}, \hat{r} について考える.
y が最も少ないときに \tilde{y} \lt y であると仮定すると,
y+1 \leq b, y \lt \hat{y} \Rightarrow \tilde{y} \lt y \lt b-1
となり,yb の差が2以上になるが,これは制約を満たさない.
青色,赤色について同様に考えると,題意を満たすときには
y=\hat{y}, b=\hat{b}, r=\hat{r}
の少なくとも1つが成立していなければならないことがわかる.
(3つの等式が全て成立するときは与えられた飾りが全て使いきれて嬉しい)

上記の等式のそれぞれが成立するときの  y, b, r の組み合わせを求め,
与えられた飾りでその組み合わせを作れるかどうかをチェックする.
組み合わせを作れる場合,合計の数を計算する.
合計の数が複数計算できた場合,それらの最大値を計算する.

//#define _GRIBCXX_DEBUG
#include <bits/stdc++.h>
# define rep(i, n) for (int i = 0; i < (int)(n); i++)
using namespace std;

template<typename integer>
integer __lcm(integer a, integer b) {
    return (a * b) / __gcd(a, b);
}


int main() {
    int a, b, c;
    cin >> a >> b >> c;

    int ans = 0;
    if (a+1 <= b && a+2 <= c) ans = max(ans, 3*a+3);
    if (b-1 <= a && b+1 <= c) ans = max(ans, 3*b);
    if (c-2 <= a && c-1 <= b) ans = max(ans, 3*c-3);

    cout << ans << endl;
    return 0;
}