Problem:
Score : 600 points

Problem Statement

Given are N points (x_i, y_i) in a two-dimensional plane.

Find the minimum radius of a circle such that all the points are inside or on it.

Constraints

2 \leq N \leq 50

0 \leq x_i \leq 1000

0 \leq y_i \leq 1000

The given N points are all different.

The values in input are all integers.

Input

Input is given from Standard Input in the following format:

N
x_1 y_1
:
x_N y_N

Output

Print the minimum radius of a circle such that all the N points are inside or on it.

Your output will be considered correct if the absolute or relative error from our answer is at most 10^{-6}.

Sample Input 1

2
0 0
1 0

Sample Output 1

0.500000000000000000

Both points are contained in the circle centered at (0.5,0) with a radius of 0.5.

Sample Input 2

3
0 0
0 1
1 0

Sample Output 2

0.707106781186497524

Sample Input 3

10
10 9
5 9
2 0
0 0
2 7
3 3
2 5
10 0
3 7
1 9

Sample Output 3

6.726812023536805158

If the absolute or relative error from our answer is at most 10^{-6}, the output will be considered correct.

Solution in PyPy3 (7.3.0) (judge verdict: Wrong Answer)

import math

def get_circle_center_and_radius1(x1, y1, x2, y2, x3, y3):
    """
    3点を通る円の中心と半径を取得
    """
    d = 2 * ((y1 - y3) * (x1 - x2) - (y1 - y2) * (x1 - x3))
    if d == 0:
        return (0, 0), 0
    x = ((y1 - y3) * (y1 ** 2 - y2 ** 2 + x1 ** 2 - x2 ** 2) - (y1 - y2) * (y1 ** 2 - y3 ** 2 + x1 ** 2 - x3 ** 2)) / d
    y = ((x1 - x3) * (x1 ** 2 - x2 ** 2 + y1 ** 2 - y2 ** 2) - (x1 - x2) * (x1 ** 2 - x3 ** 2 + y1 ** 2 - y3 ** 2)) / -d
    r = math.sqrt((x - x1) ** 2 + (y - y1) ** 2)
    return (x, y), r


def get_circle_center_and_radius2(x1, y1, x2, y2):
    x = (max(x2, x1) - min(x2, x1)) / 2
    y = (max(y2, y1) - min(y2, y1)) / 2
    r = ((x2 - x1) ** 2 + (y2 - y1) ** 2) ** 0.5 / 2
    return (x, y), r


n = int(input())
xs = []
ys = []
for _ in range(n):
    x, y = map(int, input().split())
    xs.append(x)
    ys.append(y)


if n == 2:
    print(((xs[1] - xs[0]) ** 2 + (ys[1] - ys[0]) ** 2) ** 0.5 / 2)
    exit()

ans = 10 ** 9
for i in range(n - 2):
    for j in range(i + 1, n - 1):
        for k in range(j + 1, n):
            x1 = xs[i]
            y1 = ys[i]
            x2 = xs[j]
            y2 = ys[j]
            x3 = xs[k]
            y3 = ys[k]
            (x, y), r = get_circle_center_and_radius1(x1, y1, x2, y2, x3, y3)
            if r == 0:
                continue
            ok = True
            for l in range(n):
                if l in [i, j, k]:
                    continue
                if (x - xs[l]) ** 2 + (y - ys[l]) ** 2 > r ** 2:
                    ok = False
                    break
            if ok:
                ans = min(ans, r)

for i in range(n - 1):
    for j in range(i + 1, n):
        x1 = xs[i]
        y1 = ys[i]
        x2 = xs[j]
        y2 = ys[j]
        (x, y), r = get_circle_center_and_radius2(x1, y1, x2, y2)
        ok = True
        for l in range(n):
            if l in [i, j]:
                continue
            if (x - xs[l]) ** 2 + (y - ys[l]) ** 2 > r ** 2:
                ok = False
                break
        if ok:
            ans = min(ans, r)

print(ans)