A - 目標スコアへの道 / Path to the Target Score Editorial by admin
Gemini 3.0 Flash概要
現在のスコア \(A\) を目標スコア \(B\) 以上にするために、1点あたり \(C\) コインかかる「スコアブースター」を何個買う必要があるかを計算し、その最小コストを求める問題です。
考察
この問題では、高橋君の現在の状況によって大きく2つのパターンに分けられます。
- すでに目標を達成している場合 (\(A \geq B\)) この場合、追加でスコアを上げる必要はありません。したがって、必要なコインの数は \(0\) となります。
- 目標に達していない場合 (\(A < B\)) 目標スコア \(B\) に到達するためには、あと何点必要かを考えます。必要なスコアは \(B - A\) 点です。 スコアブースター1個につきスコアが1点上がり、その価格が \(C\) コインなので、合計で \((B - A) \times C\) コインが必要になります。
制約を確認すると、 \(A, B, C\) は最大で \(10^9\) です。不足スコア \((B-A)\) が最大 \(10^9\)、価格 \(C\) も最大 \(10^9\) であるため、答えは最大で \(10^9 \times 10^9 = 10^{18}\) に達します。Pythonなどの多倍長整数を扱う言語では問題ありませんが、C++などの言語では long long 型(64ビット整数)を使用する必要がある点に注意しましょう。
アルゴリズム
条件分岐(if 文)を用いて、現在のスコアが目標を超えているかどうかで処理を分けます。
- 入力 \(A, B, C\) を受け取る。
- もし \(A \geq B\) ならば、
0を出力する。 - そうでなければ、 \((B - A) \times C\) を計算して出力する。
計算量
- 時間計算量: \(O(1)\)
- 数値の入力と、数回の算術演算および比較のみを行うため、入力の大きさに依らず一定時間で終了します。
- 空間計算量: \(O(1)\)
- 変数 \(A, B, C\) を保持するメモリのみが必要で、一定です。
実装のポイント
条件分岐の簡略化:
max(0, B - A) * Cという式を使うことで、if文を使わずに「\(A\) が \(B\) より大きい場合は \(0\) にする」という処理を一行で記述することも可能です。大きな数値の扱い: 答えが非常に大きくなる可能性があるため、オーバーフローに注意が必要です。Pythonでは標準で大きな整数を扱えるため、特別な対策なしで正解できます。
ソースコード
import sys
def solve():
# 入力を標準入力から読み込む
input_data = sys.stdin.read().split()
if not input_data:
return
a = int(input_data[0])
b = int(input_data[1])
c = int(input_data[2])
# 現在のスコアが目標スコア以上の場合は0
if a >= b:
print(0)
else:
# 不足しているスコア分だけアイテムを購入する
needed_points = b - a
total_cost = needed_points * c
print(total_cost)
if __name__ == '__main__':
solve()
この解説は gemini-3-flash-preview によって生成されました。
posted:
last update: