AtCoder Regular Contest 043 A - 点数変換 ( Python )

茶色diff埋めしている時に面白い数問を見つけたので紹介したいと思います!

問題

atcoder.jp

なかなか難しそうに見えますが段を踏んで式変形をしていけば答えを導けます!

方針

求める値がP, Qで2つあるので、2つ式を作って連立方程式を解く方針で解いていきます。

式変形

まずS人の平均点は

 \displaystyle
\overline{S} = \frac{S_1 + S_2~ + ... + ~S_{N-1} + S_N}{N}

であり、点数変換の公式にしたがった平均点を ~\overline{S'}とすると

 ~\overline{S'} = A

になればいいので、

 \displaystyle \begin{eqnarray}
\overline{S'} &=& \frac{(P \times S_1 + Q) + (P \times S_2 + Q) ~+...+~ (P \times S_{N-1} + Q) +(P \times S_N + Q)}{N} \\
&=& P \times \frac{S_1 + S_2~ + ... + ~S_{N-1} + S_N}{N} + \frac{NQ}{N} \\
&=& P \times \frac{S_1 + S_2~ + ... + ~S_{N-1} + S_N}{N} + Q \\
&=& P \times \overline{S} + Q \\
&=& A
\end{eqnarray}

になることから、

 \displaystyle \begin{align}
P \times \overline{S} + Q = A
\end{align}

が得られます。

また変換後の最大値と最小値の差がBになるので、

 \displaystyle \begin{eqnarray}
B &=& (P \times S_{max} + Q) - (P \times S_{min} + Q) \\
&=& P \cdot (S_{max} - S_{min})
\end{eqnarray}

したがって

 \displaystyle
P = \frac{B}{S_{max} - S_{min}}

になります。

しかしこれは分母が0にならない場合なので(0だと0除算になってしまう)
分母が0になるのはSが全て同じ要素です。
なのでその場合は-1を出力します。

このようにしてまずPを求めたあと、最初の式に代入してQも求めます!!

提出コード

n,a,b = map(int,input().split())
s = [int(input()) for _ in range(n)]
if max(s) - min(s) != 0:
    p = b/(max(s)-min(s))
else:
    exit(print(-1))
q = a - p*(sum(s)/n)
print(p,q)

最後に

数問が出た時には式変形を愚直にしていきましょう!
そうしたら答えを導くことができます!
精進あるのみ〜〜〜