070 - Plant Planning(★4)
キーワード
解説
と は独立なので, 個別に考えて良い. についてのみ考える.
すでに工場がある座標を とする.
に工場を建てると, その時の についての不便さは となる. 次に, を に動かす.
その時の不便さの変化量は, となる.
不便さが最小となるのは, 変化量が になる時である.
具体的には, の中央値を取る時に最小値となる.
ただし, ここでは実際の中央値を求める必要はなく, 番目の要素を求めれば十分.
つまり, A
を sort して, A[n/2]
とすれば良い.
配列を sort するのに 時間, 不便さを計算するのに 時間かかるので, 全体としては 時間で解くことが可能.
提出コード
func abs(a int) int {
if a < 0 {
return -a
}
return a
}
func main() {
n := readInt()
X := make([]int, n)
Y := make([]int, n)
for i := 0; i < n; i++ {
scanIntVariables(&X[i], &Y[i])
}
sort.Slice(X, func(i, j int) bool {
return X[i] < X[j]
})
sort.Slice(Y, func(i, j int) bool {
return Y[i] < Y[j]
})
sumX := 0
sumY := 0
lx := X[n/2]
ly := Y[n/2]
for i := 0; i < n; i++ {
sumX += abs(X[i] - lx)
sumY += abs(Y[i] - ly)
}
writeLine(sumX + sumY)
}