公式
A - テストの点差 / Test Score Difference 解説 by admin
Claude 4.6 Opus (Thinking)概要
高橋君より点数が高い生徒それぞれについて点数の差を計算し、その合計を求める問題です。
考察
この問題では、各生徒 \(i\) について以下の値を計算し、すべて足し合わせるだけです。
- \(A_i > X\) のとき:悔しさは \(A_i - X\)
- \(A_i \leq X\) のとき:悔しさは \(0\)
具体例で考えてみましょう。
例えば、\(N = 4\)、\(X = 60\)(高橋君の点数)、生徒の点数が \([80, 50, 90, 60]\) の場合:
| 生徒 | 点数 \(A_i\) | \(A_i > X\)? | 悔しさ |
|---|---|---|---|
| 1 | 80 | \(80 > 60\) → Yes | \(80 - 60 = 20\) |
| 2 | 50 | \(50 > 60\) → No | \(0\) |
| 3 | 90 | \(90 > 60\) → Yes | \(90 - 60 = 30\) |
| 4 | 60 | \(60 > 60\) → No | \(0\) |
悔しさの合計は \(20 + 0 + 30 + 0 = 50\) となります。
この問題は単純なループで解けるため、特別な工夫は不要です。\(N\) が最大 \(5 \times 10^5\) ですが、1回のループで十分間に合います。
アルゴリズム
- \(N\)(生徒数)と \(X\)(高橋君の点数)を読み込む。
- \(N\) 人の生徒の点数 \(A_1, A_2, \ldots, A_N\) を読み込む。
- 各生徒について、\(A_i > X\) ならば \(A_i - X\) を合計に加算する。
- 合計値を出力する。
コードでは Python のジェネレータ式を使い、1行で簡潔に書いています:
sum(a - X for a in A if a > X)
これは「リスト \(A\) の各要素 \(a\) について、\(a > X\) であるものだけを選び、\(a - X\) を計算して合計する」という意味です。
計算量
- 時間計算量: \(O(N)\) — 全生徒を1回ずつ見るだけ
- 空間計算量: \(O(N)\) — 生徒の点数をリストに格納する分
実装のポイント
条件 \(A_i > X\) は 厳密な不等号(\(\geq\) ではない)であることに注意してください。\(A_i = X\) のとき悔しさは \(0\) です。
Python の
sumとジェネレータ式を組み合わせることで、明示的なループや変数の初期化を省略でき、簡潔に書けます。ソースコード
N, X = map(int, input().split())
A = list(map(int, input().split()))
print(sum(a - X for a in A if a > X))
この解説は claude4.6opus-thinking によって生成されました。