2
private static final double MIN_STEP = 0.0000001;3
private static final int[][] DIRECTIONS = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};5
public double getMinDistSum(int[][] positions) {7
int n = positions.length;8
for (int[] pos : positions) {14
Node center = new Node(cx, cy, totalDistance(positions, cx, cy));17
while (step > MIN_STEP) {19
for (int[] direction : DIRECTIONS) {20
double dx = center.x + direction[0] * step, dy = center.y + direction[1] * step;21
double totalDist = totalDistance(positions, dx, dy);22
if (totalDist < center.dist) min = new Node(dx, dy, totalDist);24
if (center == min) step /= 2;31
private double sq(double p) {35
private double dist(int[] pos, double x, double y) {36
return Math.sqrt(sq(x - pos[0]) + sq(y - pos[1]));39
private double totalDistance(int[][] positions, double x, double y) {41
for (int[] pos : positions) dist += dist(pos, x, y);45
private static class Node {48
Node(double x, double y, double dist) {