公式
A - 合格者への拍手 / Applause for the Successful Candidates 解説 by admin
Claude 4.5 Opus概要
スコアが \(K\) 以上の参加者を選び、その参加者たちのスコアの合計を求める問題です。
考察
この問題で重要なポイントは以下の2点です:
- 表彰される条件: 最終スコアが \(K\) 以上の参加者のみが表彰される
- 拍手の回数: 表彰される各参加者に対して、その参加者のスコアと同じ回数だけ拍手をする
つまり、「スコアが \(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回ずつ確認するだけで済みます。特別な工夫は不要で、単純に全参加者をループで確認する方法で十分高速に解けます。
アルゴリズム
- 参加者数 \(N\) と閾値 \(K\) を読み込む
- 全参加者のスコア \(P_1, P_2, \ldots, P_N\) を読み込む
- 各スコア \(P_i\) について、\(P_i \geq K\) かどうかを判定する
- 条件を満たすスコアの合計を計算する
- 結果を出力する
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 によって生成されました。
投稿日時:
最終更新: