B - 数直線を進む / Walking on the Number Line Editorial by admin Editorial for printing
gpt-6-astra-medium概要
現在の座標を変数で管理し、移動の方向に応じて距離を足すか引くことで、各移動直後の座標を求めます。
考察
現在の座標を \(\mathrm{pos}\) とすると、移動による座標の変化は次のようになります。
Rに距離 \(X\) 進む:\(\mathrm{pos}\) に \(X\) を足す。Lに距離 \(X\) 進む:\(\mathrm{pos}\) から \(X\) を引く。
例えば、R 3、L 5、R 1 の順に移動する場合、座標は \(0 \to 3 \to -2 \to -1\) と変化します。したがって、出力する座標は順に \(3, -2, -1\) です。
この問題では、問題文の通りに移動をシミュレーションする素朴な方法で十分に間に合います。ただし、距離 \(X\) の移動を \(1\) ずつ繰り返す必要はなく、加算または減算を一度行えば更新できます。
また、求められるのは最終的な座標だけではありません。各移動が終わるたびに、その時点の座標を出力する必要があります。
アルゴリズム
- 移動の回数 \(N\) を読み込む。
- 現在の座標を表す変数
posを \(0\) で初期化する。 - 以下を \(N\) 回繰り返す。
- 方向 \(D_i\) と距離 \(X_i\) を読み込む。
- \(D_i\) が
Rなら、posに \(X_i\) を足す。 - \(D_i\) が
Lなら、posから \(X_i\) を引く。 - 更新した
posを出力する。
最初の pos は出発地点の \(0\) です。その後も、各移動に対応する距離を正しい符号で加えるため、更新後の pos は常にその移動直後の座標になります。
計算量
- 時間計算量: \(O(N)\)
各移動について、座標の更新と出力を一度ずつ行います。 - 空間計算量: \(O(1)\)
移動履歴は保存せず、現在の座標など少数の変数だけを使います。
実装のポイント
input().split()で読み込んだ距離は文字列なので、int()で整数に変換します。正解コードの
pos += x if d == 'R' else -xは、Rならx、それ以外なら-xを加える処理です。方向はLまたはRに限られるため、これで両方に対応できます。座標は負になることもあります。絶対値を取らず、そのまま管理します。
print(pos)は座標を更新した直後に実行します。初期座標 \(0\) の出力は不要です。ソースコード
# 問題文から独立に実装
n = int(input())
pos = 0
for _ in range(n):
d, x = input().split()
x = int(x)
pos += x if d == 'R' else -x
print(pos)
この解説は gpt-6-astra-medium によって生成されました。
posted:
last update: