公式

A - 合格者への拍手 / Applause for the Successful Candidates 解説 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回ずつ足し合わせるのが最も簡潔で確実です。

アルゴリズム

  1. \(N, K\) と配列 \(P\)(各参加者のスコア)を読む
  2. \(P\) の各要素 \(p\) について、
    • もし \(p \ge K\) なら答えに \(p\) を加算する
  3. 合計を出力する

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 によって生成されました。

投稿日時:
最終更新: