AtCoder Regular Contest 043 A – 点数変換 をPython3で解く

Share

AtCoder上にある問題のうち、AtCoder Problemsでdiff 800以上と判定されているものを順番に解いていく企画。
基本的な考え方は全てコード中のコメントに入れてあるので、参照のこと。

出典:
AtCoder Regular Contest 043 A – 点数変換

与えられた条件を満たす変換を作成する、どちらかというと数学の問題。
入出力例にも示されているが、コーナーケースがあるので注意すること。

# AtCoder Regular Contest 043 A - 点数変換
# https://atcoder.jp/contests/arc043/tasks/arc043_a
# tag: 考察 コーナーケース

# P, Q それぞれについて、A, B がどのように変動するのかを考える。
# P を動かした場合、全ての点数が P 倍される。
# つまり、平均値・最大値 - 最小値はそれぞれ P 倍されることになる。
# Q を動かした場合には、平均値は丁度 +Q され、最大値 - 最小値は変動しない。

# そこで、方針としてはまず P によって B を合わせてから、
# Q によって A を合わせることになる。

def main():
    N, A, B = map(int, input().split())
    scores = [int(input()) for _ in range(N)]

    # あらかじめ (最大値 - 最小値) と平均値を求めておく
    diff = max(scores) - min(scores)
    average = sum(scores) / N

    # 最大値 = 最小値 のとき、つまり点数が一種類しかない場合は、
    # 最大値 - 最小値 を 0 以外にはできない。
    if diff == 0 and B != 0:
        print(-1)
        return
    # (最大値 - 最小値) = A = 0 の時は、便宜的に P = 1 としていい
    elif diff == 0:
        P = 1
    # それ以外の場合は、P を普通に計算する
    else:
        P = B / diff

    Q = A - average * P

    print(P, Q)

main()
Share

コメントを残す

メールアドレスが公開されることはありません。