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: