#include<bits/stdc++.h>
using namespace std;
const double eps=1e-5;//精度 
int n;
struct point{
	int x,y;
}p[110];
int fa[110];
int father(int x){
	return fa[x]==x?x:fa[x]=father(fa[x]);
}
double dis(int x,int y){
	return sqrt(pow(p[x].x-p[y].x,2)+pow(p[x].y-p[y].y,2));
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		cin>>p[i].x>>p[i].y;
	}
	double l=0,r=100,mid,ans=0;
	while(r-l>eps){
		mid=(l+r)/2;
		for(int i=1;i<=n+2;i++) fa[i]=i;
		for(int i=1;i<=n;i++){//枚举所有点进行合并 
			for(int j=1;j<=n;j++)
				if(dis(i,j)<=mid*2)
				fa[father(j)]=father(i);//合并 
			if(100-p[i].y<=mid*2)fa[father(n+1)]=father(i);//连接上下边界 
			if(p[i].y+100<=mid*2)fa[father(n+2)]=father(i);
		}
			if(father(n+1)!=father(n+2)) ans=l=mid;//二者还没有接上,还可以大 
			else r=mid;//二者已经接上了,考虑更小 
	}
	printf("%.5f\n",ans);
	return 0;
} 
# include <algorithm>
# include <stdio.h>
# include <math.h>

using namespace std;

int n, k;
int x[111];
int y[111];
int f[111];

struct edge {
  int x;
  int y;
  double l;
} e[10010];

bool cmp(edge a, edge b) {
  return a.l < b.l;
}

int fi(int x) {
  int t = x;
  while (t != f[t]) {
    t = f[t];
  }
  while (x != f[x]) {
    int T = f[x];
    f[x] = t;
    x = T;
  }
  return t;
}

void ji(int x, int y) {
  f[fi(x)] = fi(y);
}

int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%d%d", x + i, y + i);
    for (int j = 1; j < i; j++) {
      e[++k].x = i;
      e[k].y = j;
      e[k].l = sqrt((x[j] - x[i]) * (x[j] - x[i]) + (y[j] - y[i]) * (y[j] - y[i]));
    }
  }
  for (int i = 1; i <= n; i++) {
    e[++k].x = 0;
    e[k].y = i;
    e[k].l = 100 - y[i];
    e[++k].x = n + 1;
    e[k].y = i;
    e[k].l = y[i] + 100;
  }
  e[++k].x = 0;
  e[k].y = n + 1;
  e[k].l = 200;
  sort(e + 1, e + 1 + k, cmp);
  for (int i = 0; i <= n + 1; i++) {
    f[i] = i;
  }
  for (int i = 1;; i++) {
    ji(e[i].x, e[i].y);
    if (fi(0) == fi(n + 1)) {
      printf("%.18f", e[i].l / 2);
      return 0;
    }
  }
}