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: