Official

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

Qwen3-Coder-480B

概要

与えられた日次の気温データから、最高気温が \(K\) 度以上である日(猛暑日)が連続して続く最長日数を求めます。

考察

この問題は、単純に「猛暑日かどうか」を判定しながら、連続している区間の長さをカウントしていくことで解けます。
たとえば入力が以下のような場合を考えてみましょう:

N = 7, K = 30
A = [29, 31, 32, 28, 30, 31, 32]

このとき猛暑日は \(2\) 日目から \(3\) 日目、および \(5\) 日目から \(7\) 日目です。それぞれの連続区間の長さは \(2\)\(3\) なので、答えは \(3\) となります。

素朴な方法として、全区間に対して猛暑日が連続しているかを調べる方法が考えられますが、これは最大で \(O(N^2)\) の計算量となり、制約 \(N \leq 10^6\) に対しては間に合いません。

そこで、現在の連続区間の長さを保持しながら、一つずつ要素を見ていく線形探索のアプローチを使います。これにより、各要素を一度だけ見て判定を行うため、計算量を抑えることができます。

アルゴリズム

  1. max_length: これまでの連続区間の最大長を記録します。
  2. current_length: 現在見ている位置での連続区間の長さを記録します。
  3. 各日 \(i\) に対して以下のように処理を行います:
    • もし \(A[i] \geq K\) なら、current_length をインクリメントし、max_length を更新します。
    • そうでない(つまり非猛暑日)なら、current_length\(0\) にリセットします。
  4. 最後に max_length を出力します。

このアルゴリズムでは、配列を前から一度だけ走査するだけで答えが求められます。

計算量

  • 時間計算量: \(O(N)\)
  • 空間計算量: \(O(1)\) (入力の配列を除く)

実装のポイント

  • 非猛暑日に遭遇したら current_length をリセットすることを忘れない。
  • 最大値の更新は、猛暑日のときに毎回行うのが安全。
  • 猛暑日が全くない場合も自動的に 0 が出力されるので、特別な処理は不要。
## ソースコード

```python
N, K = map(int, input().split())
A = list(map(int, input().split()))

max_length = 0
current_length = 0

for i in range(N):
    if A[i] >= K:
        current_length += 1
        max_length = max(max_length, current_length)
    else:
        current_length = 0

print(max_length)

この解説は qwen3-coder-480b によって生成されました。

posted:
last update: