Pagini recente » Cod sursa (job #456217) | Cod sursa (job #2342990) | Cod sursa (job #1546376) | Cod sursa (job #1363933) | Cod sursa (job #1586771)
# include <fstream>
# include <algorithm>
# include <vector>
# include <iomanip>
# define mp make_pair
# define f first
# define s second
# define NR 1000005
# define MOD1 581
# define MOD2 473
using namespace std;
ifstream f("harta2.in");
ofstream g("harta2.out");
vector <pair <int, int> > v[MOD1][MOD2];
struct elem {
int x, y;
}a[NR];
int i,j,n,m;
double ci,cs,mij,sol;
int dx[]={1, 0, 1};
int dy[]={0, -1, -1};
void curata () {
for (int i=0; i<MOD1; ++i)
for (int j=0; j<MOD2; ++j)
v[i][j].clear();
}
bool bullshit (int x, int y, int X, int Y, double K) {
double x2=x+K, y2=y-K;
if (x<=X && X<=x2 && y<=Y && Y<=x2) return 1;
else return 0;
}
bool add(int X, int Y, int x, int y, double K) {
for (int i=0; i<v[X][Y].size(); ++i)
if ((int)(v[X][Y][i].f/K) == (int)(x/K) && (int)(v[X][Y][i].s/K) == (int)(y/K)) return 0;
return 1;
}
bool solutie (double K) {
//le impart in caroiaj
int i,j,x,y,X,Y;
curata ();
for (i=1; i<=n; ++i) {
x=((int)(a[i].x/K))%MOD1; y=((int)(a[i].y/K))%MOD2;
if (add(x, y, a[i].x, a[i].y, K)) v[x][y].push_back(mp(a[i].x, a[i].y));
else return 0;
}
//daca am ajuns pana aici inseamna ca fiecare punct
//are caroul propriu
//verific cu distanta vecinii
for (i=1; i<=n; ++i) {
x=((int)(a[i].x/K))%MOD1; y=((int)(a[i].y/K))%MOD2;
for (int I=0; I<3; ++I) {
X=x+dx[I]; Y=y+dy[I];
if (X>=0 && Y>=0 && v[X][Y].size()) {
for (int j=0; j<v[X][Y].size(); ++j) {
if (bullshit(a[i].x, a[i].y, v[X][Y][j].f, v[X][Y][j].s, K))
return 0;
}
}
}
}
return 1;
}
int main ()
{
f>>n;
for (i=1; i<=n; ++i) {
f>>a[i].x>>a[i].y;
a[i].y*=3;
}
ci=0; cs=1000;
while (ci+0.001 <= cs) {
mij=(ci+cs)/2;
if (solutie (mij)) ci=mij+0.001, sol=mij;
else cs=mij-0.001;
}
g<<fixed<<setprecision(3)<<sol/3<<"\n";
return 0;
}