ツバサの備忘録

主に備忘録代わりに精進記録を載せていくつもりです。

ABC115 D - Christmas

問題
提出コード
まずは、レベルLバーガーをすべて食べたときの、食べる全体の枚数および食べるパティの枚数を求めます。
食べる全体の枚数をa[L]とすると、
a[L] = 2 \times a[L-1] + 3
となります。
食べるパティの枚数をp[L]とすると、
p[L] = 2 \times  p[L-1] + 1
となります。
初期値は、 a[0] = 1 , p[0] = 1です。
答えは、再帰によって求めることができます。
solve(n,x) = レベルnバーガーを、下からx層食べるときに食べることができるパティの枚数
とします。ここから先は場合分けをして求めます。

  • n = 0のとき
    x=1なら答えは1、x=0なら答えは0です(問題の制約により、2以上になることはありません)。

  • 上記を除き、x=1のとき
    答えは0です。

  • a[n] = xのとき
    答えはp[n]となります。

  • 上記を除き、a[n]/2 + 1 \leqq xのとき
    この式が意味するのは、レベルnバーガーの半分を食べるかどうか、です。
    必ずバーガーは奇数になるので、真ん中のパティの分が+1になっています。
    このパターンでは、レベルn-1バーガーを1つと、真ん中のパティを食べることが確定しているので、残りの部分だけ調べればよいです。
    ということで、答えはp[n-1] + 1 + solve(n-1,x - a[n]/2 - 1)となります。

  • それ以外、すなわちa[n]/2 +1 \gt xのとき
    一番下にあるバン1枚を食べたら、あとはレベルn-1バーガーを食べる問題に帰着できます。
    答えはsolve(n-1,x-1)です。

    ということで、上のような再帰関数を作成すれば、答えを求めることができます。