#include using namespace std; typedef long long int ll; typedef unsigned long long int llu; typedef pair pii; typedef vector vi; typedef vector > vii; #define rrep(i, m, n) for(int i=m; i=m; i--) #define erev(i, n) for(int i=n; i>=1; i--) #define rev(i, n) for(int i=n-1; i>=0; i--) #define EACH(v) (v).begin(), (v).end() #define CNT(a, n, x) (upper_bound(a, a+n, x)-lower_bound(a, a+n, x)) #define mp make_pair template inline void minup(T1 &m, T2 x){ if(m>x) m=static_cast(x); } template inline void maxup(T1 &m, T2 x){ if(m(x); } #define INF 1000000000 #define MOD 1000000009 #define EPS 1E-9 typedef complex P; int dot(P p, P q){ return real(p*conj(q)); } int det(P p, P q){ return imag(p*conj(q)); } #define MAX_N 1000 int n; int x, y; P z[MAX_N]; double res; int dist(P z, P w) { return real(z-w)*real(z-w)+imag(z-w)*imag(z-w); } bool check(P z, P w) { return dist(z, w) <= 100; } struct UnionFind { vi data; UnionFind(int size) : data(size, -1) {} bool unite(int x, int y){ x = root(x); y = root(y); if(x != y){ if(data[y] < data[x]) swap(x, y); data[x] += data[y]; data[y] = x; } return x != y; } bool same(int x, int y){ return root(x) == root(y); } int root(int x){ return data[x] < 0 ? x : data[x] = root(data[x]); } int size(int x){ return -data[root(x)]; } }; bool compare(const P& p, const P& q) { return p.real() != q.real() ? p.real() < q.real() : p.imag() < q.imag(); } vector

convex_hull(P* ps, int n) { sort(ps, ps + n, compare); int k = 0; vector

qs(n * 2); rep(i, n){ while(k>1 && det((qs[k-1]-qs[k-2]), (ps[i]-qs[k-1])) <= 0) k--; qs[k++] = ps[i]; } int t = k; rev(i, n-1){ while(k>t && det((qs[k-1]-qs[k-2]), (ps[i]-qs[k-1])) <= 0) k--; qs[k++] = ps[i]; } qs.resize(k - 1); return qs; } int main() { cin >> n; rep(i, n){ cin >> x >> y; z[i] = P(x, y); } if(n==0){ puts("1"); return 0; } vector

pque = convex_hull(z, n); UnionFind uf(n); rep(i, pque.size()) rep(j, i) if(check(pque[i], pque[j])) uf.unite(i, j); int n = pque.size(); if(n == 2){ printf("%.10f\n", 2 + (check(pque[0], pque[1]) ? sqrt(dist(pque[0], pque[1])) : 0)); return 0; } int i=0, j=0; rep(k, n){ if(!compare(pque[i], pque[k])) i = k; if( compare(pque[j], pque[k])) j = k; } int si = i; int sj = j; while(i!=sj || j!=si){ maxup(res, dist(pque[i], pque[j])); if(det(pque[(i+1)%n] - pque[i], pque[(j+1)%n] - pque[j]) < 0) i = (i+1)%n; else j = (j+1)%n; } printf("%.10f\n", sqrt(res) + 2.0); return 0; }