0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ABC156 C - Rally を解いた

Last updated at Posted at 2021-10-14

abc156c_1.png
abc156c_2.png
abc156c_3.png

文章通り入れてみた。別に sort しなくても
良いと思うけど。。。

abc156c.py
N = int(input())
X = list(map(int,input().split()))
X.sort()

ans = float("inf")
for i in range(1,101):
    score = 0
    for j in range(N):
        score += (X[j]-i)**2
    ans = min(score,ans)

print(ans)#28ms

別解として面白いものを見つけた。
座標として有効なのは X の平均値とあたりを付ける場合。

abc156c.py
def solv():
    N = int(input())
    X = list(map(int,input().split()))
    
    canditates = [sum(X)//N,sum(X)//N+1]
    a,b = 0,0
    for x in X:
        a += (x-canditates[0])**2
        b += (x-canditates[1])**2
    if a > b:
        print(b)
    else:
        print(a)
solv()#28ms

しかし、平均値も 2.01 なのか 2.91 なのかで、
妥当な平均値は 2 の場合、3の場合と別れる。

それぞれの場合で体力の消耗を合算していき、
小さい方を出力する。

なぜ平均値?
例えば、問題では 2 点が与えられたとする。
その場合の、それぞれの体力消耗は以下で求まる

(x0-p)^2 = x0^2 -2x0p+p^2
(x1-p)^2 = x1^2 -2x1p+p^2

上記を合算し、p について整理をすると

2{p^2 - {(x0+x1)/2}p + (x0^2+x1^2)/2}

となる。お気づきだと思うが
上記を p に関する二次関数と判断すると

p = (x0+x1)/2 の時、p の関数は最小値になることが分かる

(x0+x1)/2 って与えられた 2 点の平均ですよね?(笑)

何も考えず、雰囲気で for 文を回すのと
数式で考えて for 文を回すのでは問題に対するスタンスが
全く違うようです。

処理時間は殆ど変らないけど(笑)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?