Official

B - 登山道の安定区間 / Stable Sections of a Mountain Trail Editorial by MMNMM


ある安定した登山区間に対して、右にひとつ伸ばした区間が安定した登山区間であるかどうかは、一番右の \(2\) つの地点の標高の差が \(K\) 以下であるかだけで決まります。

よって、地点の列を順番に見て、現在見ている地点が右端になるような最も長い安定した登山区間の長さを管理することでこの問題を解くことができます。

実装例は以下のようになります。

#include <iostream>
using namespace std;

int main() {
    int N, K;
    cin >> N >> K;

    int prev = -K; // 直前の標高(はじめは危険になるようにしておく)
    int now_length = 0; // 現在の要素が右端になるようなものの中で最も長い安全な登山区間の長さ
    int ans = 0; // これまで見た中で最も長い安全な登山区間の長さ
    for (int i = 0; i < N; ++i) {
        int A;
        cin >> A;
        if (abs(prev - A) > K) { // 危険なら
            now_length = 0; // 長さをリセット
        }
        prev = A; // 直前の標高を更新し
        ++now_length; // 長さを伸ばし
        ans = max(ans, now_length); // 答えを更新する
    }

    cout << ans << endl;
    return 0;
}
N, K = map(int, input().split())

prev = -K # 直前の標高(はじめは危険になるようにしておく)
now_length = 0 # 現在の要素が右端になるようなものの中で最も長い安全な登山区間の長さ
ans = 0 # これまで見た中で最も長い安全な登山区間の長さ
for A in map(int, input().split()):
    if abs(prev - A) > K: # 危険なら
        now_length = 0 # 長さをリセット

    prev = A # 直前の標高を更新し
    now_length += 1 # 長さを伸ばし
    ans = max(ans, now_length) # 答えを更新する

print(ans)

posted:
last update: