Official
B - 数直線を進む / Walking on the Number Line Editorial by admin Editorial for printing
gpt-6-astra-medium概要
現在の座標を変数で管理し、指示された方向と距離に従って更新します。移動するたびに、更新後の座標を出力します。
考察
数直線上では、正の方向への移動は座標の加算、負の方向への移動は座標の減算で表せます。
現在の座標を \(p\) とすると、距離 \(X_i\) の移動後の座標は次のようになります。
- \(D_i\) が
Rなら、\(p + X_i\) - \(D_i\) が
Lなら、\(p - X_i\)
例えば、R 3、L 5、R 1 の順に移動すると、座標は \(0 \to 3 \to -2 \to -1\) と変化します。したがって、\(3\)、\(-2\)、\(-1\) をそれぞれ別の行に出力します。
この問題は、指示どおりに移動を再現する素朴なシミュレーションで十分に解けます。距離を \(1\) ずつ進める必要はなく、加算または減算を一度行えば、その移動を処理できます。
なお、求められるのは最終的な座標だけではありません。各移動が終わった直後の座標を出力する必要があります。
アルゴリズム
- 移動回数 \(N\) を読み込む。
- 現在の座標を表す変数
positionを \(0\) に初期化する。 - 次の処理を \(N\) 回繰り返す。
- 方向 \(D_i\) と距離 \(X_i\) を読み込む。
- \(D_i\) が
Rなら、positionに \(X_i\) を加える。 - \(D_i\) が
Lなら、positionから \(X_i\) を引く。 - 更新後の
positionを出力する。
最初の座標は \(0\) であり、各指示に応じて正しく加算・減算しているため、position は常にその時点の高橋君の座標を表します。よって、各移動後にこれを出力すれば答えになります。
計算量
- 時間計算量: \(O(N)\)
各移動について、入力・座標の更新・出力を一度ずつ行います。 - 空間計算量: \(O(1)\)
現在の座標と、その移動の情報だけを保持します。
実装のポイント
- 座標は負になることもあります。絶対値に変換せず、そのまま出力します。
- 初期座標の \(0\) は出力せず、座標を更新した後に出力します。
- このコードは
sys.stdin.buffer.readline()で入力を読み込むため、方向dは文字列ではなくバイト列です。そのため、"R"ではなくb"R"と比較します。 - 次の一行で、方向に応じた座標の更新を行っています。
position += int(x) if d == b"R" else -int(x)
R の場合は正の距離を、それ以外、つまり L の場合は負の距離を加えています。
ソースコード
import sys
def main():
line = sys.stdin.buffer.readline()
if not line:
return
n = int(line)
position = 0
write = sys.stdout.write
for _ in range(n):
d, x = sys.stdin.buffer.readline().split()
position += int(x) if d == b"R" else -int(x)
write(f"{position}\n")
if __name__ == "__main__":
main()
この解説は gpt-6-astra-medium によって生成されました。
posted:
last update: