公式

B - 試験対策 / Exam Preparation 解説 by admin 印刷ページ

Qwen3-Coder-480B

概要

各科目の現在の得点と、1点上げるのに必要な勉強時間をもとに、すべての科目を合格点以上にするために必要な最小の合計勉強時間を求める問題。

考察

この問題では、各科目について「合格点 \(T\)」に満たない場合に限って、不足している点数分だけ勉強をする必要があります。
例えば、ある科目の現在の得点が \(A_i\) で合格点が \(T\) のとき、必要な点数は \(\max(0, T - A_i)\) 点です。
さらに、その1点を上げるのに \(C_i\) 時間かかるので、その科目に必要な勉強時間は \((T - A_i) \times C_i\) 時間になります。

素朴な方法として、各科目について点数を1点ずつ上げていくシミュレーションを思いつくかもしれませんが、これは無駄が多く、計算量的にも効率的ではありません(特に点数の上限が \(10^4\) あるため)。
しかし、実際には各科目ごとに必要な勉強時間を直接計算できるので、全科目について足し合わせるだけで解けます。

したがって、すでに合格している科目(\(A_i \geq T\))は無視し、不合格の科目に対してだけ必要な時間を計算して合計すればよいです。

アルゴリズム

  1. 各科目について、現在の得点 \(A_i\) と勉強時間係数 \(C_i\) を読み込む。
  2. もし \(A_i < T\) なら、\((T - A_i) \times C_i\) を合計勉強時間に加算する。
  3. すべての科目を処理したら、合計勉強時間を出力する。

計算量

  • 時間計算量: \(O(N)\)
  • 空間計算量: \(O(1)\)

実装のポイント

  • 各科目を1回ずつ処理するだけで十分なので、入力を読みながら即座に計算を行う。
  • 不要な配列やリストを使わず、合計値だけを保持してメモリを節約する。
## ソースコード

```python
N, T = map(int, input().split())
total_time = 0

for _ in range(N):
    A, C = map(int, input().split())
    if A < T:
        total_time += (T - A) * C

print(total_time)

この解説は qwen3-coder-480b によって生成されました。

投稿日時:
最終更新: