典型90【070 – Plant Planning(★4)】をpython解説

Python

AtCoder の問題を解くために必要な実力を付けるために作られた「典型問題」を解いていく企画として、「典型90」があります。

今回は、その内、の70問目である「070 – Plant Planning(★4)」を解説していきたいと思います。
なにか、間違っているところなどありましたら、@EitaSugiまで、ご指導ご鞭撻の程、よろしくお願い致します!

問題名 【070 – Plant Planning(★4)】

問題

問題概要

二次元平面上にN棟の工場が存在し、i番目の工場は座標(Xi​,Yi​) に位置しています。目的は、発電所を建設する最適な位置を選び、その位置での発電所から各工場までのマンハッタン距離の総和(不便さ)が最小となる値を求めることです。

考察

この問題を直感的に解くためには、まず1次元の問題として考えることがポイントです。なぜなら今回距離はマンハッタン距離で定義されているためです。

\(マンハッタン距離=∣x_1​−x_2​∣+∣y_1​−y_2​∣\)

マンハッタン距離の場合は、xとyはそれぞれ独立に計算することができるため、まずは考察を簡単にするために1次元(x)のみで考えてみます。

1次元での考察

工場が以下のように1次元上に存在する場合を考えます。

1  3  6 7
---------

発電所の位置を a としたとき、a は3から6の間のどこかに置けば良いことがわかります。その理由は以下の通りです。

  • a の位置を3から4に移動すると、工場1と3の移動距離は1ずつ増えるが、工場6と7の移動距離は1ずつ減少する。結果的に全体の移動距離は変わらない。
  • しかし、a の位置を3から2に移動すると、工場1の移動距離は1減少するが、工場3, 6, 7の移動距離は1ずつ増加する。全体の移動距離が増えてしまう。

この考察から、a の最適な位置は中央値(数列が偶数の場合は、N/2 と N/2+1 の間)であることがわかります。

2次元での考察

上記の1次元での考察をX座標とY座標にそれぞれ適用することで、2次元上での発電所の最適な位置を求めることができます。

典型解法:マンハッタン距離

コード

N = int(input())

X = []
Y = []
for i in range(N):
    x,y = map(int, input().split())
    X.append(x)
    Y.append(y)

X.sort()
Y.sort()

x = X[N//2]
y = Y[N//2]

ans = 0
for i in range(N):
    ans += abs(x-X[i]) + abs(y-Y[i])
print(ans)

まとめ

前の問題【069 – Colorful Blocks 2(★3)】
次の問題【】

コメント

タイトルとURLをコピーしました