公式

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回のループで十分間に合います。

アルゴリズム

  1. \(N\)(生徒数)と \(X\)(高橋君の点数)を読み込む。
  2. \(N\) 人の生徒の点数 \(A_1, A_2, \ldots, A_N\) を読み込む。
  3. 各生徒について、\(A_i > X\) ならば \(A_i - X\) を合計に加算する。
  4. 合計値を出力する。

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

投稿日時:
最終更新: