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 Go (1.6) (judge verdict: Wrong Answer)

package main

import (
	"fmt"
	"math"
	"math/cmplx"
)

func main() {
	var n int
	fmt.Scan(&n)
	z := make([]complex128, n, n)

	answer := math.MaxFloat64

	for i := 0; i < n; i++ {
		var x, y float64
		fmt.Scan(&x)
		fmt.Scan(&y)
		z[i] = complex(x, y)
	}

	for i1 := 0; i1 < n; i1++ {
		for i2 := i1 + 1; i2 < n; i2++ {
			z0 := (z[i1] + z[i2]) / 2.0
			r := cmplx.Abs(z[i1]-z[i2]) / 2.0

			flag := true
			for j := 0; j < n; j++ {
				if cmplx.Abs(z[j]-z0) > r {
					flag = false
				}
			}
			if flag && r < answer {
				answer = r
			}
		}
	}

	for i1 := 0; i1 < n; i1++ {
		for i2 := i1 + 1; i2 < n; i2++ {
			for i3 := i2 + 1; i3 < n; i3++ {
				z1, z2, z3 := z[i1], z[i2], z[i3]
				if math.Abs(imag((z1-z2)/(z1-z3))) < math.SmallestNonzeroFloat64 {
					continue
				}

				z0 := ((z2-z3)*z1*cmplx.Conj(z1) + (z3-z1)*z2*cmplx.Conj(z2) + (z1-z2)*z3*cmplx.Conj(z3)) /
					((z2-z3)*cmplx.Conj(z1) + (z3-z1)*cmplx.Conj(z2) + (z1-z2)*cmplx.Conj(z3))
				r := cmplx.Abs(z[i1] - z0)

				flag := true
				for j := 0; j < n; j++ {
					if cmplx.Abs(z[j]-z0) > r {
						flag = false
					}
				}
				if flag && r < answer {
					answer = r
				}
			}
		}
	}

	fmt.Println(answer)
}