公式
A - 連続する高得点区間 / Consecutive High-Score Segments 解説 by admin
Qwen3-Coder-480B概要
出席番号順に並んだ生徒のテスト結果から、点数が合格点 \(K\) 以上の連続した区間の数を数える問題。
考察
この問題では、点数が合格点 \(K\) 以上である生徒を「合格者」と呼び、連続する合格者たちを1つのグループとして扱います。例えば、点数が \([60, 70, 40, 80, 90]\) で合格点が \(70\) の場合、合格者のインデックスは \(1, 3, 4\)(0-indexedなら)となりますが、連続しているのは \([3, 4]\) のみなので、グループ数は2になります。
このように、連続する区間の数を数えるには、その区間の開始点だけを検出すれば良いです。つまり、「前の生徒が不合格で、今の生徒が合格」になった瞬間に新しいグループが始まったと判断できます。
愚直に区間を探索してグループを数えると、最悪ケースで \(O(N^2)\) かかる可能性があり、制約 \(N \leq 2 \times 10^5\) に対しては時間内に解けません。しかし、上記のように「区間の開始タイミング」だけを見ることで、1回の走査で答えを求めることができます。
アルゴリズム
- 生徒の点数リスト \(A\) を先頭から順に見ていきます。
- 各生徒について、点数 \(A_i \geq K\) かどうかを判定します。
- 「直前の生徒が不合格」かつ「現在の生徒が合格」であれば、新しい連続区間が始まったとみなしてカウントを増やします。
- この判定のために、「現在連続区間に入っているか」を管理するフラグ
in_streakを使います。 - 最後にカウントされた値を出力します。
具体例
入力:
5 70
60 80 90 40 70
- 点数: [60, 80, 90, 40, 70]
- 合格者: x, o, o, x, o (o が合格)
連続区間は: - [80, 90] → 1グループ - [70] → 1グループ
合計2回の表彰式が必要です。
計算量
- 時間計算量: \(O(N)\)
- 空間計算量: \(O(1)\) (入力の配列を除く)
実装のポイント
- フラグ変数
in_streakを使うことで、連続区間の開始点を正確に捉えることができます。 - 最初の要素から順に処理するので、境界条件も特に気にしなくて大丈夫です。
- 合格者が全くいない場合でも、カウントは増えないので自然と答えが \(0\) になります。
## ソースコード
```python
N, K = map(int, input().split())
A = list(map(int, input().split()))
count = 0
in_streak = False
for i in range(N):
if A[i] >= K:
if not in_streak:
count += 1
in_streak = True
else:
in_streak = False
print(count)
この解説は qwen3-coder-480b によって生成されました。
投稿日時:
最終更新: