标签:des style blog http io ar color os sp
3年前刚接触ACM的时候做的这一题,交了几十次怎么写都过不了.........
今天无意中又看到了这一题,随手一写终于过了.....
2 0 0 1 1 2 1 1 1 1 3 -1.5 0 0 0 0 1.5 0
0.71 0.00 0.75
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const double eps=1e-8;
const int maxn=100100;
int n;
int dcmp(double x)
{
if(fabs(x)<eps) return 0;
return (x>0)?1:-1;
}
struct Point
{
double x,y;
}p[maxn],temp[maxn];
bool cmpxy(Point a,Point b)
{
if(dcmp(a.x-b.x)!=0)
return dcmp(a.x-b.x)<0;
return dcmp(a.y-b.y)<0;
}
bool cmpy(Point a,Point b)
{
return dcmp(a.y-b.y)<0;
}
inline double square(double x)
{
return x*x;
}
double dist(Point a,Point b)
{
return sqrt(square(a.x-b.x)+square(a.y-b.y));
}
double Close_pair(int left,int right)
{
double d=1e30;
if(left==right) return d;
if(left+1==right) return dist(p[left],p[right]);
int mid=(left+right)/2;
d=min(Close_pair(left,mid),Close_pair(mid+1,right));
int k=0;
for(int i=left;i<=right;i++)
{
if(dcmp(square(p[i].x-p[mid].x)-d)<=0)
{
temp[k++]=p[i];
}
}
sort(temp,temp+k,cmpy);
for(int i=0;i<k;i++)
{
for(int j=i+1;j<k&&dcmp(square(temp[i].y-temp[j].y)-d)<0;j++)
{
d=min(d,dist(temp[i],temp[j]));
}
}
return d;
}
int main()
{
while(scanf("%d",&n)!=EOF&&n)
{
for(int i=0;i<n;i++)
{
double x,y;
scanf("%lf%lf",&x,&y);
p[i].x=x;p[i].y=y;
}
sort(p,p+n,cmpxy);
printf("%.2lf\n",Close_pair(0,n-1)/2.);
}
return 0;
}
标签:des style blog http io ar color os sp
原文地址:http://blog.csdn.net/ck_boss/article/details/41646169