A - 連続する高得点区間 / Consecutive High-Score Segments 解説 by admin
Gemini 3.0 Flash概要
この問題は、与えられた \(N\) 個の点数のうち、合格点 \(K\) 以上の値が連続している区間(グループ)がいくつあるかを数える問題です。
考察
この問題を解く鍵は、「新しい表彰式のグループがいつ始まるか」を正確に捉えることです。
例えば、合格点を \(80\) 点としたとき、点数が \([90, 85, 50, 80, 40]\) と並んでいたとします。 1. 最初の \(90\) 点の人は合格です。ここで新しいグループが始まります(回数:1)。 2. 次の \(85\) 点の人も合格ですが、前の人も合格だったので、同じグループとして扱います(回数は増えません)。 3. 次の \(50\) 点の人は不合格です。ここで一旦グループが途切れます。 4. 次の \(80\) 点の人は合格です。前の人は不合格だったので、ここでまた新しいグループが始まります(回数:2)。 5. 最後の \(40\) 点の人は不合格です。
このように、「不合格者(または列の先頭)の後に、初めて合格者が現れた瞬間」にカウントを増やすことで、グループの総数を求めることができます。
アルゴリズム
「現在、合格者のグループの中にいるかどうか」を管理するフラグ(変数)を用意して、点数を先頭から順番に確認していきます。
- 表彰式の回数を表す変数
countを \(0\) で初期化します。 - 「現在グループの中にいるか」を表すフラグ
in_groupをFalseで初期化します。 - 各生徒の点数
scoreについて、以下の処理を繰り返します。- もし
scoreが \(K\) 以上(合格)の場合:- まだグループの中にいなければ(
in_groupがFalseなら)、新しいグループの始まりなのでcountを \(1\) 増やし、in_groupをTrueにします。 - すでにグループの中なら、何もしません。
- まだグループの中にいなければ(
- もし
scoreが \(K\) 未満(不合格)の場合:- グループが途切れるため、
in_groupをFalseにします。
- グループが途切れるため、
- もし
- 最終的な
countの値を出力します。
計算量
- 時間計算量: \(O(N)\) 生徒の人数 \(N\) に対して、点数のリストを最初から最後まで \(1\) 回走査するだけなので、非常に高速に動作します。
- 空間計算量: \(O(N)\) 入力をリストとして保持するために \(O(N)\) のメモリを使用します。
実装のポイント
フラグの切り替え: 合格点以上のときに「カウントしてフラグを立てる」、合格点未満のときに「フラグを倒す」というシンプルなロジックで実装できます。
大量の入力: \(N\) が最大 \(2 \times 10^5\) と比較的大きいため、Python では
sys.stdin.read().split()などを使って一括で入力を読み込むと実行時間を短縮できます。ソースコード
import sys
def solve():
# 入力を受け取る
input_data = sys.stdin.read().split()
if not input_data:
return
n = int(input_data[0])
k = int(input_data[1])
a = list(map(int, input_data[2:]))
count = 0
in_group = False
# 各生徒の点数を確認していく
for score in a:
if score >= k:
# 合格点以上かつ、現在グループのカウント中でなければ新しいグループを開始
if not in_group:
count += 1
in_group = True
else:
# 合格点未満なら、連続したグループが途切れたことを示す
in_group = False
# 結果を出力
print(count)
if __name__ == "__main__":
solve()
この解説は gemini-3-flash-preview によって生成されました。
投稿日時:
最終更新: