公式
B - テストの目標点 / Target Score for the Test 解説 by admin
GPT 5.2 High概要
各科目の点数が目標点 \(T\) に届いていない分を合計し、その合計が追加課題の上限 \(M\) 以下なら達成可能(最小必要数=その合計)、超えるなら不可能として -1 を出力します。
考察
- 追加課題 1 つで「任意の 1 科目を 1 点上げられる」ので、ある科目 \(i\) の点数 \(A_i\) が \(T\) 未満なら、その科目だけで最低でも \(T-A_i\) 個の追加課題が必要です。
逆に、\(A_i \ge T\) の科目には追加課題を使う必要がありません。 - したがって、全科目で必要な追加課題数の最小値は
[ \sum_{i=1}^{N} \max(0,\,T-A_i) ] に一致します。これより少ない回数では、どこかの科目が必ず \(T\) に届きません。 - 素朴に「どの科目に課題を割り当てるか」をシミュレーションしたり、毎回最小の点数を探して上げるような実装をすると、無駄に複雑になったり、場合によっては \(M\) が最大 \(10^9\) なので「課題を 1 個ずつ」処理して TLE になる可能性があります。
- 本問では「不足分の合計」を一度計算するだけで十分です。これが \(M\) 以下なら可能、超えるなら不可能です。
具体例:
- \(T=70\)、点数が \([65, 80, 69]\) のとき、不足分は \(5, 0, 1\) なので合計 \(6\)。
\(M \ge 6\) なら最小必要数は \(6\)、\(M < 6\) なら不可能です。
アルゴリズム
- 変数
need = 0を用意する。 - 各科目の点数 \(A_i\) について、
- もし \(A_i < T\) なら
need += (T - A_i)を加算する。
- もし \(A_i < T\) なら
- 最後に
need <= Mならneedを出力し、そうでなければ-1を出力する。
この need が「必要な追加課題の最小個数」そのものです。
計算量
- 時間計算量: \(O(N)\)(全科目を 1 回ずつ見るだけ)
- 空間計算量: \(O(1)\)(入力を逐次処理する想定で追加領域は定数)
実装のポイント
\(N\) が最大 \(10^5\) なので、Python では
sys.stdin.read()などでまとめて読み込み、ループで処理すると安定します。合計
needは最大で \(N \times 100 \le 10^7\) 程度ですが、一般に大きくなり得るので整数型(Python のint)で問題ありません。\(T=0\) のようなケースでは不足分は常に 0 になり、答えは 0(追加課題不要)になります。
ソースコード
import sys
def main():
data = sys.stdin.read().strip().split()
if not data:
return
it = iter(data)
N = int(next(it))
M = int(next(it))
T = int(next(it))
need = 0
for _ in range(N):
a = int(next(it))
if a < T:
need += T - a
print(need if need <= M else -1)
if __name__ == "__main__":
main()
この解説は gpt-5.2-high によって生成されました。
投稿日時:
最終更新: