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 C (GCC 5.4.1) (judge verdict: Wrong Answer)

#include<stdio.h>
#include<math.h>
int x[1010],y[1010];
double MIN(double a,double b){return a<b?a:b;}
double MAX(double a,double b){return a>b?a:b;}
double px,py;
int f(int i,int j,int k){
  double a=2*(x[i]-x[j]),b=2*(y[i]-y[j]),c=2*(x[i]-x[k]),d=2*(y[i]-y[k]);
  double e=x[i]*x[i]-x[j]*x[j]+y[i]*y[i]-y[j]*y[j];
  double f=x[i]*x[i]-x[k]*x[k]+y[i]*y[i]-y[k]*y[k];
  double n=a*d-b*c;
  if(fabs(n)<1e-6)return 1;
  printf("n!!%lf\n",n);
  px=(e*d-b*f)/n;
  py=(a*f-e*c)/n;
  return 0;
}
//long long g(long long x,long long y){return x*x+y*y;}
int main(){
  int n,i,j,k,l,x[1010],y[1010];
  double  min=1e18,d,e,max;
  scanf("%d",&n);
  for(i=0;i<n;i++)scanf("%d %d",&x[i],&y[i]);
  if(n==2){
    printf("%.10lf\n",hypot(x[0]-x[1],y[0]-y[1])/2.0);
    return 0;
  }
  for(i=0;i<n;i++){
    for(j=0;j<n;j++){
      px=(x[i]+x[j])/2.0;
      py=(y[i]+y[j])/2.0;
      for(k=max=0;k<n;k++){
	max=MAX(max,hypot(x[k]-px,y[k]-py));
      }
      min=MIN(min,max);
    }
  }
  //printf("%.10lf\n",min);
  for(i=0;i<n;i++){
    for(j=i+1;j<n;j++){
      for(k=j+1;k<n;k++){
	if(f(i,j,k))continue;
	printf("%lf %lf\n",px,py);
	d=hypot(px-x[i],py-y[i]);
	for(l=0;l<n;l++){
	  e=hypot(px-x[l],px-y[l]);
	  if(d<e)goto NEXT;
	}
	min=MIN(min,d);
      NEXT:;
      }
    }
  }
  printf("%.10lf\n",min);
  return 0;
}