N = gets.to_i Y = gets.split.map &:to_i case Y.uniq.size when 1 p 1 when 2 p 0 else Y.sort! cusum = [sum = 0] + Y.map{|y| sum += y } f = ->idx{ lsum = cusum[idx] lave = lsum.fdiv(idx).round ldist = Y[0...idx].map{|n| (n - lave).abs }.sum rsum = sum - lsum rave = rsum.fdiv(N - idx).round rdist = Y[idx..-1].map{|n| (n - rave).abs }.sum ldist + rdist } l = 1 r = N-1 40.times{ if f[(l * 2 + r) / 3] < f[(l + r * 2) / 3] r = (l + r * 2) / 3 else l = (l * 2 + r) / 3 end } # p [l,r] p f[(l + r) / 2] end