Official
A - 合格者への拍手 / Applause for the Successful Candidates Editorial by admin
GPT 5.2 High概要
スコアが \(K\) 以上の参加者だけを対象に、そのスコア値の合計(=拍手回数の合計)を求める問題です。
考察
表彰するのは「最終スコアが \(K\) 以上」の参加者全員で、拍手回数は「その人のスコアと同じ回数」です。
つまり、求める答えは
- 条件 \(P_i \ge K\) を満たす参加者の
- スコア \(P_i\) の合計
に等しいです。
たとえば \(K=60\)、スコアが \([40, 60, 80]\) なら、表彰対象は \(60, 80\) の2人で、拍手合計は \(60+80=140\) 回です。
素朴に「表彰対象者ごとに \(P_i\) 回ループして数える」ような実装をすると、最大で \(100\) 回×\(10^5\) 人=\(10^7\) 程度なので一見間に合いそうですが、無駄が多く、問題の本質(合計を求めるだけ)から外れます。
この問題は単に「条件を満たす要素の総和」を取ればよく、1回ずつ足し合わせるのが最も簡潔で確実です。
アルゴリズム
- \(N, K\) と配列 \(P\)(各参加者のスコア)を読む
- \(P\) の各要素 \(p\) について、
- もし \(p \ge K\) なら答えに \(p\) を加算する
- 合計を出力する
Pythonでは sum(p for p in scores if p >= K) のように書くと、「条件を満たす要素だけを合計する」がそのまま表現できます。
計算量
- 時間計算量: \(O(N)\)(全員のスコアを1回ずつ見るだけ)
- 空間計算量: \(O(N)\)(入力のスコア配列を保持するため)
実装のポイント
\(N\) が最大 \(10^5\) なので、入力は
sys.stdin.buffer.read()のような高速入力を使うと安心です。条件判定は
p >= Kのみで十分で、ソートなどは不要です。ソースコード
import sys
def main():
data = list(map(int, sys.stdin.buffer.read().split()))
if not data:
return
N, K = data[0], data[1]
scores = data[2:2+N]
ans = sum(p for p in scores if p >= K)
print(ans)
if __name__ == "__main__":
main()
この解説は gpt-5.2-high によって生成されました。
posted:
last update: