Problem:
キョウトという街は古い寺社仏閣で有名な観光地である。

イクタ君は数人の友人とキョウト観光に来ていたが、全員が好き勝手に行動した結果、みんな迷子になってしまった。

そこでイクタ君は、なるべく早く全員と合流するためには集合場所をどこにするのがよいか考えることにした。

キョウトの道路は東西と南北に距離10の間隔で無数に走っており、無限に広がる正方格子とみなすことができる。

道路は直線であるとみなし、幅は無いものとする。
また、街の中心を基準として東に距離x、北に距離y移動した位置を(x,y)という座標で表す。

街の中心である(0,0)では東西の道路と南北の道路が交差している。

下図はキョウトの道路と、いくつかの点の座標を図示したものである。

N人の観光客の座標(Xi,Yi)が整数で与えられるので、N人が道路上を移動して1点に集合するのに必要な時間の最小値を答えよ。

観光客は時間1あたり距離1の速さで連続的に道路上を動くことができるとする。

与えられるN人の観光客の座標はそれぞれ相異なり、また全ての座標は道路上にあることが保証されている。

また、複数の観光客が同時に1点に存在したり、観光客同士がすれ違うように移動することも可能であるとする。

Input

入力は以下の形式で与えられる。

N
X1 Y1
...
XN YN

1行目のNは観光客の人数である。
次のN行のうちi行目(1≤ i ≤ N)はi番目の観光客の位置(Xi, Yi)を表している。
Xi,Yiはそれぞれ整数で与えられる。

Constraints

入力中の各変数は以下の制約を満たす。

2 ≤ N ≤ 10000

−108 ≤ Xi, Yi ≤ 108

i ≠ j のとき (Xi, Yi) ≠ (Xj, Yj)

Xi と Yi のうち少なくとも一方は10の倍数である

Output

問題の解を1行に出力せよ。
10−3までの絶対誤差を許容する。

Sample Input 1

3
5 10
-10 0
3 -10

Output for the Sample Input 1

14

(0, 1)に集合すればよい（この入力例は問題文中の図と対応している）

Sample Input 2

2
0 0
0 1

Output for the Sample Input 2

0.5

(0, 0.5)に集合すればよい（整数座標以外に集まる場合もあることに注意せよ）

Sample Input 3

4
100000000 100000000
100000000 -100000000
-100000000 100000000
-100000000 -100000000

Output for the Sample Input 3

200000000

Solution in C (judge verdict: Accepted)

// AOJ 2618: Trip to Kyoto
// 2018.1.25 bal4u@uu

#include <stdio.h>

#define ABS(a)    ((a)>=0?(a):-(a))
#define MIN(a,b)  ((a)<=(b)?(a):(b))

int x1[10002], y1[10002], x2[10002], y2[10002];

//#define getchar_unlocked()  getchar()
int in()
{
	int n = 0;
	int c = getchar_unlocked();
	if (c == '-') {
		c = getchar_unlocked();
		do n = (n<<3)+(n<<1) + (c & 0xf), c = getchar_unlocked();
		while (c >= '0');
		return -n;
	}
	do n = (n<<3)+(n<<1) + (c & 0xf), c = getchar_unlocked();
	while (c >= '0');
	return n;
}

int calc(int x1, int y1, int x2, int y2)
{
	x1 += 200000000, y1 += 200000000;
	x2 += 200000000, y2 += 200000000;
	if (x1%20 == 0 && x2%20 == 0) {
		if      (x1 == x2) return ABS(y1-y2);
		else if (y1/20 == y2/20) return ABS(x1-x2) + MIN(y1%20+y2%20, 40-y1%20-y2%20);
	} else if (y1%20 == 0 && y2%20 == 0) {
		if      (y1 == y2) return ABS(x1-x2);
		else if (x1/20 == x2/20) return ABS(y1-y2) + MIN(x1%20+x2%20, 40-x1%20-x2%20);
	}
	return ABS(x1-x2) + ABS(y1-y2);
}

int main()
{
	int n, x, y, i, j, k, s, t, ans;
	int xmin, xmax, ymin, ymax;
	int x0, y0;

	n = in();
	xmin = ymin = 1000000000, xmax = ymax = -1000000000; 
	for (i = 0; i < n; i++) {
		x = in(), y = in();
		x <<= 1, y <<= 1;
		x1[i] = x,   y1[i] = y;
		x2[i] = x+y, y2[i] = x-y;
		if (x2[i] < xmin) xmin = x2[i];
		if (x2[i] > xmax) xmax = x2[i];
		if (y2[i] < ymin) ymin = y2[i];
		if (y2[i] > ymax) ymax = y2[i];
	}
 
	x = (xmin + xmax) >> 1, y = (ymin + ymax) >> 1;
	x0 = (x + y) >> 1, y0 = (x - y) >> 1;

	ans = 0x7fffffff;
	for (i = x0-50; i <= x0+50; i++) {
		for (j = y0-50; j <= y0+50; j++) {
			if (ABS(i) % 20 && ABS(j) % 20) continue;
			t = 0; 
			for (k = 0; k < n; k++) {
				if (t < (s = calc(i, j, x1[k], y1[k]))) t = s;
			}
			if (ans > t) ans = t;
		}
	}
	printf("%.12lf\n", (double)ans/2);
	return 0;
}