ABC369 B問題の解説(Python)

はじめに

AtCoder Beginner Contest(略称:ABC)とは、AtCoderが開催している、競技プログラミングコンテストのことです。

今回はABC369のB問題を解説していきます。

ABC369 B – Piano 3

問題

問題

100個の鍵盤からなるピアノがあります。このピアノの左からi個目の鍵盤のことを鍵盤iと呼びます。

N回にわたってこのピアノの鍵盤を一つずつ押すことで曲を演奏します。 i回目に押す鍵盤は鍵盤 \(A_i\) であり、右手で押すか左手で押すかも決まっています。

演奏を始める前、両手をそれぞれ好きな鍵盤の上に置くことができます。 演奏中、片方の手を鍵盤xの上から鍵盤yの上へと動かすと、疲労度が \(|y-x|\) 増加します。

演奏が終了した時点での疲労度は最小でいくつになるかを求める問題です。

制約

  • \(1 \leqq N \leqq 100\)
  • \(1 \leqq A_i \leqq 100\)

思考の筋道

疲労度を最小にするためには、左手と右手の初期位置を、はじめにその手を使う場所とすればよいです。そうすれば、はじめにその手を使うときの疲労度が0で済みますね。

2回目以降は、その手の移動距離分、疲労度が増加します。移動距離を計算するために、直前の左手の位置と右手の位置を変数で管理しておきましょう。

変数の初期値を-1にすることで、その手を使うのが初めてなのか2回目以降なのか、判別できます。

コード

from sys import stdin
N = int(input())
l = [stdin.readline()[:-1] for _ in range(N)]

left = -1
right = -1
hirou = 0

for row in l:
    A, S = row.split()
    if S == "L":
        if left != -1:
            hirou += abs(left - int(A))
        left = int(A)
    else:
        if right != -1:
            hirou += abs(right - int(A))
        right = int(A)

print(hirou)

リンク