Official

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

Claude 4.5 Opus

概要

スコアが \(K\) 以上の参加者を選び、その参加者たちのスコアの合計を求める問題です。

考察

この問題で重要なポイントは以下の2点です:

  1. 表彰される条件: 最終スコアが \(K\) 以上の参加者のみが表彰される
  2. 拍手の回数: 表彰される各参加者に対して、その参加者のスコアと同じ回数だけ拍手をする

つまり、「スコアが \(K\) 以上の参加者」を全員見つけて、そのスコアを合計すればよいことがわかります。

具体例

例えば、\(N = 5\)\(K = 60\)、スコアが \([50, 70, 80, 40, 90]\) の場合を考えます。

  • スコア \(50\): \(50 < 60\) なので表彰されない
  • スコア \(70\): \(70 \geq 60\) なので表彰される → 拍手 \(70\)
  • スコア \(80\): \(80 \geq 60\) なので表彰される → 拍手 \(80\)
  • スコア \(40\): \(40 < 60\) なので表彰されない
  • スコア \(90\): \(90 \geq 60\) なので表彰される → 拍手 \(90\)

合計: \(70 + 80 + 90 = 240\)

素朴なアプローチで問題ないか

この問題では \(N \leq 10^5\) であり、各参加者を1回ずつ確認するだけで済みます。特別な工夫は不要で、単純に全参加者をループで確認する方法で十分高速に解けます。

アルゴリズム

  1. 参加者数 \(N\) と閾値 \(K\) を読み込む
  2. 全参加者のスコア \(P_1, P_2, \ldots, P_N\) を読み込む
  3. 各スコア \(P_i\) について、\(P_i \geq K\) かどうかを判定する
  4. 条件を満たすスコアの合計を計算する
  5. 結果を出力する

Pythonでは、条件付きのリスト内包表記を使って簡潔に書けます:

total = sum(p for p in P if p >= K)

これは「\(P\) の中で \(K\) 以上の要素 \(p\) をすべて足し合わせる」という意味です。

計算量

  • 時間計算量: \(O(N)\)
    • 全参加者のスコアを1回ずつ確認するため
  • 空間計算量: \(O(N)\)
    • 全参加者のスコアをリストに保存するため

実装のポイント

  • Pythonの sum() 関数にジェネレータ式を渡すことで、メモリ効率よく条件を満たす要素の合計を計算できます

  • リスト内包表記の if 句を使うと、フィルタリングと集計を1行で簡潔に書けます

  • 表彰される参加者が0人の場合でも、sum() は正しく \(0\) を返すため、特別な場合分けは不要です

    ソースコード

N, K = map(int, input().split())
P = list(map(int, input().split()))

total = sum(p for p in P if p >= K)
print(total)

この解説は claude4.5opus によって生成されました。

posted:
last update: