
updated on 2019-04-15
ヒント
𝑁 個の数 𝑎1, 𝑎2, 𝑎3, … , 𝑎𝑁 があります。 |𝑥 − 𝑎1| + |𝑥 − 𝑎2| + ⋯ + |𝑥 − 𝑎𝑁| の最小値を求めなさい。
実は、最小値となる 𝑥 は「𝑎1, 𝑎2, 𝑎3, … , 𝑎𝑁 の中央値」となる!
wikipedia: 中央値(ちゅうおうち、英: median)とは、代表値の一つで、有限個のデータを小さい順に並べたとき中央に位置する値。 たとえば5人の人がいるとき、その5人の年齢の中央値は3番目に年寄りな人の年齢である。 ただし、データが偶数個の場合は、中央に近い2つの値の算術平均をとる。
(a.size % 2).zero? ? a[a.size/2 - 1, 2].inject(:+) / 2.0 : a[a.size/2]解答
n = gets.to_i
a, b = n.times.map{ gets.strip.split.map(&:to_i) }.transpose
a.sort!
b.sort!
# a配列の中央値 偶数の時の中央値は真ん中二つの平均値なので注意
ent = (n%2).zero? ? (a[n/2 - 1, 2].inject(:+) / 2.0).round : a[n/2]
# b配列の中央値
exit = (n%2).zero? ? (b[n/2 - 1, 2].inject(:+) / 2.0).round : b[n/2]
count = 0
n.times do |i|
count += (ent- a[i]).abs
count += (b[i] - a[i]).abs
count += (exit - b[i]).abs
end
puts count