Official

A - 連続晴天の最長記録 / Longest Streak of Hot Days Editorial by admin

GPT 5.2 High

概要

各日の最高気温が \(K\) 以上かどうかを見て、「猛暑日」が連続する最長の長さを求める問題です。

考察

「猛暑日が連続する区間の最大長」は、配列を左から順に見ながら「今どれだけ連続しているか」を数えるだけで求まります。

例えば \(K=30\)、気温が
\([29, 30, 31, 28, 30, 30]\) のとき、 - 1日目は非猛暑日なので連続数は \(0\) - 2日目・3日目は猛暑日なので連続数は \(1 \rightarrow 2\) - 4日目で途切れるので連続数は \(0\) に戻る - 5日目・6日目で \(1 \rightarrow 2\)

この間の最大は \(2\) なので答えは \(2\) です。

素朴に「すべての区間」を調べて連続か判定すると、区間数が \(O(N^2)\) あり \(N \le 10^6\) では到底間に合いません(TLE)。
そこで、1回の走査で「現在の連続長」と「最大値」だけを更新する方法にします。

アルゴリズム

次の2つの変数を用意します。

  • cur: 現在見ている位置までの「猛暑日連続の長さ」
  • best: これまでに出現した連続長の最大値

配列を左から順に見て、各 \(A_i\) について - もし \(A_i \ge K\) なら猛暑日なので cur += 1 とし、best = max(best, cur) を更新 - そうでなければ連続が途切れるので cur = 0 にリセット

最後に best を出力します。猛暑日が一度もなければ best\(0\) のままなので、そのまま \(0\) が出力されます。

計算量

  • 時間計算量: \(O(N)\)(1回なめるだけ)
  • 空間計算量: \(O(1)\)(追加の配列を持たず、変数のみ)

実装のポイント

  • \(N\) が最大 \(10^6\) と大きいため、Pythonでは sys.stdin.buffer.read().split() を使って高速に入力を読むと安全です。

  • 連続が途切れたときに cur を必ず \(0\) に戻すのが重要です(ここを忘れると誤答になります)。

    ソースコード

import sys

def main():
    it = map(int, sys.stdin.buffer.read().split())
    N = next(it)
    K = next(it)

    best = 0
    cur = 0
    for _ in range(N):
        a = next(it)
        if a >= K:
            cur += 1
            if cur > best:
                best = cur
        else:
            cur = 0

    sys.stdout.write(str(best))

if __name__ == "__main__":
    main()

この解説は gpt-5.2-high によって生成されました。

posted:
last update: