Official

B - Piano 3 Editorial by yuto1115

解説

左手と右手が現在それぞれどの鍵盤の上にあるかを管理しながら、\(1,2,\dots,N\) 回目に押す鍵盤を順番に見ていって、手の移動が必要になったタイミングでその移動の疲労度を順次答えに加算していけばよいです。

下記の実装例では、長さ \(2\) の配列 \(\text{pos}\) を用意し、\(pos[0], pos[1]\) がそれぞれ左手、右手の現在の位置を管理するようにしています。 また、それぞれの手の位置の初期値を \(-1\) とし、\(-1\) から他の鍵盤への移動の際には疲労度を答えに加算しないことで、「演奏開始前に適切な位置(その手で最初に押す鍵盤の位置)に手を置く」という動作を実現しています。

実装例 (C++) :

#include <bits/stdc++.h>

using namespace std;

int main() {
    int n;
    cin >> n;
    vector<int> pos = {-1, -1};  // 0: left, 1: right
    int ans = 0;
    for (int i = 0; i < n; i++) {
        int a;
        char s;
        cin >> a >> s;
        int hand = (s == 'R');
        if (pos[hand] != -1) ans += abs(pos[hand] - a);
        pos[hand] = a;
    }
    cout << ans << endl;
}

実装例 (Python) :

n = int(input())
pos = [-1, -1]   # 0: left, 1: right
ans = 0
for i in range(n):
    a, s = input().split()
    a = int(a)
    hand = (0 if s == 'L' else 1)
    if pos[hand] != -1:
        ans += abs(pos[hand] - a)
    pos[hand] = a
print(ans)

posted:
last update: