公式
A - 予算オーバー / Over Budget 解説 by admin
Gemini 3.0 Flash (Thinking)概要
\(N\) 個のプロジェクトについて、現在の予算 \(A_i\) が適正予算 \(B_i\) を上回っている(\(A_i > B_i\))ケースを特定し、その「プロジェクト数」と「予算超過額(\(A_i - B_i\))の総和」を求める問題です。
考察
各プロジェクトは独立しているため、1つずつ順番に判定を行えばよいです。
条件の判定: 各プロジェクトについて、\(A_i > B_i\) であるかどうかをチェックします。
- \(A_i > B_i\) の場合:予算オーバーです。カウントを 1 増やし、合計額に \(A_i - B_i\) を加算します。
- \(A_i \leq B_i\) の場合:予算内です。何も行いません。
数値の大きさ:
- プロジェクト数 \(N\) は最大 \(2 \times 10^5\) です。そのため、1つずつの処理を \(O(1)\) で行い、全体で \(O(N)\) の計算量に収める必要があります。
- 返還額の合計は、最大で \(2 \times 10^5 \times 10^9 = 2 \times 10^{14}\) 程度になる可能性があります。Pythonでは大きな整数も自動的に扱えますが、他の言語(C++など)では 64bit 整数型(
long longなど)を使う必要がある点に注意しましょう。
アルゴリズム
- 予算オーバーのプロジェクト数を数える変数
over_budget_countと、返還額の合計を保持する変数total_refundを \(0\) で初期化します。 - 入力された \(N\) 個のペア \((A_i, B_i)\) について、以下の処理を繰り返します。
- もし \(A_i > B_i\) ならば:
over_budget_countに \(1\) を加える。total_refundに \(A_i - B_i\) を加える。
- もし \(A_i > B_i\) ならば:
- 最後に
over_budget_countとtotal_refundを空白区切りで出力します。
計算量
- 時間計算量: \(O(N)\) \(N\) 個の要素を一度ずつ走査するため、プロジェクト数に比例した時間で処理が完了します。
- 空間計算量: \(O(N)\)
今回の実装では
sys.stdin.read().split()を用いて入力を一度にリストとして読み込んでいるため、入力サイズに比例したメモリを使用します。 ※ 1行ずつ読み込んで処理するように書き換えれば、\(O(1)\) に抑えることも可能です。
実装のポイント
高速な入力: Pythonにおいて \(N\) が大きい(\(10^5\) 以上)場合、
input()を繰り返すと実行時間が長くなることがあります。sys.stdin.read().split()を使って一括で読み込む、あるいはsys.stdin.readlineを使うことで、入出力によるボトルネックを回避できます。条件分岐: 「\(A_i \leq B_i\) の場合は返還の必要はない」という条件は、単に \(A_i > B_i\) のときだけ処理を行うように実装すれば自然に満たされます。
ソースコード
import sys
def solve():
# 標準入力からすべてのデータを取得し、空白で分割してリスト化する
input_data = sys.stdin.read().split()
if not input_data:
return
# プロジェクト数 N
n = int(input_data[0])
over_budget_count = 0
total_refund = 0
# 2個ずつ A_i, B_i を取り出して判定する
for i in range(n):
a = int(input_data[1 + 2 * i])
b = int(input_data[2 + 2 * i])
if a > b:
over_budget_count += 1
total_refund += a - b
# 結果を出力
print(f"{over_budget_count} {total_refund}")
if __name__ == "__main__":
solve()
この解説は gemini-3-flash-thinking によって生成されました。