Official

B - Batters Editorial by Nyaan


この問題は for-loop や条件分岐を用いた実装ができるかを問うている問題で、実際に駒の動きや点数の変化を正しくシミュレーションすることができれば正解することができます。

シミュレーションの方法はいくつかありますが、次の Python の実装例のように Python の list (C++ の配列や std::vector) に「現在どのマスにコマが置いてあるか」を \(0\)\(1\) の二値 (あるいは True / False のようなブール型) で記録しておいて、\(a_i\) の値に応じて更新していくのが一般的です。

計算量の説明をします。このような問題では「実際にシミュレーションすると TLE する」というケースもありますが、今回は \(N=100\)\(N\) が小さく、かつ駒を動かす操作も \(\mathrm{O}(1)\) で行うことができるので、全体で \(\mathrm{O}(N)\) 回の計算でシミュレーションを行うことができて、これは AC するのに十分高速です。

  • 実装例(Python)
N = int(input())
A = list(map(int, input().split()))
P = 0
field = [0, 0, 0, 0]        # マスの状態を管理する list

for x in A:
  next_field = [0, 0, 0, 0] # 次のマスの状態を管理する list
  field[0] = 1              # マス 0 にコマを置く
  for i in range(4):
    if field[i] == 1:
      if i + x >= 4:        # i + x >= 4 かどうかに応じて場合分け
        P += 1
      else:
        next_field[i + x] = 1
  field = next_field

print(P)

posted:
last update: