Official

A - 合格者への拍手 / Applause for the Successful Candidates Editorial by admin

Gemini 3.0 Flash

概要

\(N\) 人の参加者のうち、スコアがしきい値 \(K\) 以上である参加者を特定し、その人たちのスコアの総和を求める問題です。

考察

この問題は、与えられた条件をそのままシミュレーションすることで解くことができます。

具体的には、以下の手順を全参加者に対して行います。 1. 参加者のスコア \(P_i\)\(K\) 以上であるかを確認する。 2. もし \(K\) 以上であれば、そのスコア \(P_i\) を合計値に加算する。 3. \(K\) 未満であれば、何もしない。

参加者数 \(N\) は最大で \(10^5\) ですが、各参加者に対して行う操作は「比較」と「加算」という非常に単純なものです。計算量が \(O(N)\) であれば、現代のコンピュータでは 1 秒間に \(10^8\) 回程度の計算が可能であるため、制限時間内に十分に余裕を持って正解することができます。

アルゴリズム

  1. 合計の拍手回数を管理する変数 total_claps\(0\) で初期化します。
  2. 入力された \(N\) 個のスコア \(P_1, P_2, \ldots, P_N\) を順番に 1 つずつ取り出して、以下の処理を繰り返します。
    • 取り出したスコアを \(score\) としたとき、もし \(score \ge K\) ならば、total_claps\(score\) を加算します。
  3. すべてのスコアを確認し終えた後、最終的な total_claps の値を出力します。

計算量

  • 時間計算量: \(O(N)\)
    • 参加者の人数 \(N\) に対して、1 回ずつループを回して判定を行うため、実行時間は \(N\) に比例します。
  • 空間計算量: \(O(N)\)
    • 提供されたコードでは sys.stdin.read().split() を用いて入力値をすべてリストとしてメモリ上に保持しているため、入力の数 \(N\) に比例したメモリを消費します。

実装のポイント

  • 効率的な入力: \(N\)\(10^5\) と大きめなので、Python の標準的な input() を何度も呼び出すより、sys.stdin.read().split() で一括して読み込むことで実行時間を短縮できます。

  • 条件判定: 問題文の「\(K\) 以上」という条件を score >= k と正しく記述することが重要です。

  • オーバーフロー: Python の int 型は自動的に多倍長整数として扱われるため、合計値が大きくなっても(今回の最大値は \(100 \times 10^5 = 10^7\) 程度ですが)オーバーフローを心配する必要はありません。

    ソースコード

import sys

def solve():
    # 標準入力から全てのデータを取得
    input_data = sys.stdin.read().split()
    if not input_data:
        return
    
    # N, K を取得
    n = int(input_data[0])
    k = int(input_data[1])
    
    # スコアのリストを取得
    scores = map(int, input_data[2:])
    
    total_claps = 0
    for score in scores:
        # スコアが K 以上の場合、そのスコア分だけ拍手回数に加算
        if score >= k:
            total_claps += score
            
    # 結果を出力
    print(total_claps)

if __name__ == "__main__":
    solve()

この解説は gemini-3-flash-preview によって生成されました。

posted:
last update: