B - テストの目標点 / Target Score for the Test 解説 by admin
Qwen3-Coder-480B概要
高橋君が各科目の点数を目標点 \(T\) 以上にするために必要な追加課題の最小個数を求め、それが提出可能数 \(M\) 以内であれば出力する問題です。
考察
この問題では、各科目 \(i\) の点数 \(A_i\) が目標点 \(T\) に満たない場合、差分 \(T - A_i\) の追加課題が必要になります。
つまり、すべての科目について「目標点までの不足点数」を合計した値が、必要な追加課題の総数となります。
例えば、\(N = 3\), \(T = 80\), \(A = [70, 85, 75]\) の場合:
- 科目1: \(80 - 70 = 10\) 点不足
- 科目2: \(85 \geq 80\) なので OK
- 科目3: \(80 - 75 = 5\) 点不足
→ 合計で \(10 + 5 = 15\) 個の追加課題が必要です。
この合計が \(M\) 以下であれば補習を回避でき、超過している場合は無理なので -1 を出力します。
素朴なアプローチとして、1点ずつシミュレーションすることは考えられますが、\(M\) が最大 \(10^9\) なので非現実的です。しかし、実際には必要な点数の合計だけを見ればよいので、効率的に解けます。
アルゴリズム
- 各科目 \(i\) に対して、\(T - A_i\) が正であればその分だけ点数を補う必要がある。
- 全科目についてこの「不足点数」を合計する。
- 合計が \(M\) 以下であればその値を出力し、そうでなければ
-1を出力する。
具体的には以下の計算を行う: $\( \text{needed\_points} = \sum_{i=1}^{N} \max(0, T - A_i) \)$
計算量
- 時間計算量: \(O(N)\)
- 空間計算量: \(O(1)\)(入力データを除く)
実装のポイント
max(0, T - a)を使うことで、すでに目標点を超えている科目は無視できる。- 合計値が \(M\) を超えるかどうかを最後に判定すれば良い。
## ソースコード
```python
N, M, T = map(int, input().split())
A = list(map(int, input().split()))
# 目標点T未満の科目に対して、何点足りないかを計算
needed_points = sum(max(0, T - a) for a in A)
# 必要な追加課題数がM以下なら可能
if needed_points <= M:
print(needed_points)
else:
print(-1)
この解説は qwen3-coder-480b によって生成されました。
投稿日時:
最終更新: