Official

A - 目標スコアへの道 / Path to the Target Score Editorial by admin

Gemini 3.0 Flash

概要

現在のスコア \(A\) を目標スコア \(B\) 以上にするために、1点あたり \(C\) コインかかる「スコアブースター」を何個買う必要があるかを計算し、その最小コストを求める問題です。

考察

この問題では、高橋君の現在の状況によって大きく2つのパターンに分けられます。

  1. すでに目標を達成している場合 (\(A \geq B\)) この場合、追加でスコアを上げる必要はありません。したがって、必要なコインの数は \(0\) となります。
  2. 目標に達していない場合 (\(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 文)を用いて、現在のスコアが目標を超えているかどうかで処理を分けます。

  1. 入力 \(A, B, C\) を受け取る。
  2. もし \(A \geq B\) ならば、0 を出力する。
  3. そうでなければ、 \((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: