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++14 (GCC 5.4.1) (judge verdict: Runtime Error)

#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
//#pragma comment(linker, "/STACK:5000000000")
//#pragma GCC optimize "-O3"
//#pragma GCC optimize("Ofast,no-stack-protector")
#pragma GCC target("mmx,avx,fma")
//#pragma GCC optimize ("unroll-loops")

using namespace __gnu_pbds;
using namespace std;

template <class T>
istream& operator >> (istream& in, vector<T>& v){ for(auto& e : v){ in >> e;} return in;}
template <class T>
istream& operator >> (istream& in, vector<pair<T, T> >& v){ for(auto& e : v){ in >> e.first >> e.second;} return in;}

//#define int long long
//#define int short int
#define pb push_back
#define mk make_pair
#define X first
#define Y second
#define cont continue
#define ret return
#define For(i, a, b) for (int i = a; i < b;i++)
#define forn(i, a) for (int i = 0;i < a;i++)
#define ford(i, a, b) for (int i = b - 1;i >= a;i--)
#define fordn(i, a) for (int i = a - 1;i >= 0;i--)
#define forr(x, arr) for(auto &x: arr)
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
#define REE(s_) {cout << s_ << '\n';exit(0);}
#define makeunique(x) sort(all(x)), (x).resize(unique(all(x)) - (x).begin())
#ifdef debug
    template <char d = ' ', class T>
    ostream& operator << (ostream& out, vector<T>& v){ out << "[";for(int i = 0;i < v.size();i++){out << v[i];if (i != v.size() - 1) out << ", ";} out << "]"; return out; }
    template <char d = ' ', class T>
    ostream& operator << (ostream& out, vector<pair<T, T> >& v){ out << "[";for(int i = 0;i < v.size();i++){ out << ' ' << v[i].first << ", " << v[i].second; if (i != v.size() - 1) out << '\n'; } out << "]"; return out;}
    template <char d = ' ', class T>
    ostream& operator << (ostream& out, set<T>& v){out << "["; for(auto i = v.begin();i != v.end();i++){ out << *i; if (*i != *v.rbegin()) out << ", ";} out << "]"; return out;}
    template <char d = ' ', class T>
    ostream& operator << (ostream& out, multiset<T>& v){out << "["; for(auto i = v.begin();i != v.end();i++){ out << *i; if (*i != *v.rbegin()) out << ", ";} out << "]"; return out;}
#else
template <char d = ' ', class T>
ostream& operator << (ostream& out, vector<T>& v){ for(auto& e : v){ out << e << d;} return out;}
template <char d = ' ', class T>
ostream& operator << (ostream& out, vector<pair<T, T> >& v){ for(auto& e : v){ out << e.first << ' ' << e.second << '\n';} return out;}
template <char d = ' ', class T>
ostream& operator << (ostream& out, set<T>& v){ for(auto& e : v){ out << e << d;} return out;}
#endif
typedef long long ll;
typedef double ldd;
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<string> vs;
typedef vector<pii> vpi;
typedef vector<vi> vvi;
typedef map<int, int> mii;
typedef unordered_map<string, int> msi;
typedef set<int> si;
typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> indexed_set;
template<class T> bool uin(T &a, T b) { return a > b ? (a = b, true) : false; }
template<class T> bool uax(T &a, T b) { return a < b ? (a = b, true) : false; }
template <typename T> string toString(T val){ostringstream oss; oss << val; return oss.str();}
template<typename T> T sqr(T a) {return a * a;}
mt19937 gen(chrono::high_resolution_clock::now().time_since_epoch().count());
const int dx[4] = {0, 1, 0, -1};
const int dy[4] = {1, 0, -1, 0};
//const int dx[8] = {0, 0, 1, 1, 1, -1, -1, -1};
//const int dy[8] = {1, -1, 1, 0, -1, 1, 0, -1};
//const int dx[8] = {2, 2, 1, 1, -1, -1, -2, -2};
//const int dy[8] = {1, -1, 2, -2, 2, -2, 1, -1};
const ldd eps = 1e-8;
const int mod = (int)1e9 + 7;
//const int MAX_MEM = 1e8;
//int mpos = 0;
//char mem[MAX_MEM];
//inline void * operator new ( size_t n ) {
//    assert((mpos += n) <= MAX_MEM);
//    return (void *)(mem + mpos - n);
//}
//inline void operator delete ( void * ) noexcept { }

signed main() {
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    #ifdef KULA
            freopen("input.txt", "r", stdin);
//            freopen("output.txt", "w", stdout);
    #else
//            freopen("mushrooms.in", "r", stdin);
//            freopen("mushrooms.out", "w", stdout);
    #endif
    int n;
    cin >> n;
    vector<pair<ldd, ldd> > a(n);
    forn(i, n){
        cin >> a[i].X >> a[i].Y;
    }
    sort(all(a));
    ldd ans = INT_MAX;
    forn(i, n){
        For(j, 0, n){
            For(k, 0, n){
                ldd ma = (a[j].Y - a[i].Y) / (a[j].X - a[i].X);
                ldd mb = (a[k].Y - a[j].Y) / (a[k].X - a[j].X);
                ldd x = (ma * mb * (a[i].Y - a[k].Y) + mb * (a[i].X + a[j].X) - ma * (a[j].X + a[k].X)) / (2 * (mb - ma));
                ldd y = ((a[i].X + a[j].X) / 2 - x) / (ma) + (a[i].Y + a[j].Y) / 2;
                ldd r = hypot(a[i].X - x, a[i].Y - y);
                int ok = 1;
                forn(kk, n){
                    if (hypot(a[kk].X - x, a[kk].Y - y) <= r){
                    }
                    else ok = 0;
                }
                if (ok) uin(ans, r);
            }
        }
    }
    forn(i, n){
        For(j, 0, n){
            ldd x = ldd(a[i].X + a[j].X) / 2;
            ldd y = ldd(a[i].Y + a[j].Y) / 2;
            ldd r = max(hypot(a[i].X - x,a[i].Y -y), hypot(a[j].X - x, a[j].Y - y));
            int ok = 1;
            forn(kk, n){
                if (hypot(a[kk].X - x, a[kk].Y - y) <= r+eps){

                }
                else ok = 0;
            }
            if (ok) {
                uin(ans, r);
            }
        }
    }
    cout << fixed << setprecision(50) << ans;
    return 0;
}