解题思路:
(其实我用有道翻译了半天也没看懂题是什么鬼=。=)
嘛,其实就是在给的一堆点中,找到最近的一组。然后求出两点之间距离的一半。
分治法没看懂:http://blog.csdn.net/lishuhuakai/article/details/9161843
1.将各点按x排序,求出相邻两点的最短距离。
2.将各点按y排序,求出相邻两点的最短距离。
3.比较x,y得出的最短距离。
代码:【C++代码超时,改成C过了= =||】
#include<cmath>
#include<algorithm>
#define MAX 100000
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#define MAX 100000
#include<stdio.h>
#include<stdlib.h>
using namespace std;
struct point
{
double x,y;
}p[MAX];
{
double x,y;
}p[MAX];
int cmpx(point a,point b)
{
return a.x<b.x;
}
{
return a.x<b.x;
}
int cmpy(point a,point b)
{
return a.y<b.y;
}
{
return a.y<b.y;
}
double length(int i,int j)
{
double x,y;
x=(p[i].x-p[j].x)*(p[i].x-p[j].x);
y=(p[i].y-p[j].y)*(p[i].y-p[j].y);
return sqrt(x+y);
}
{
double x,y;
x=(p[i].x-p[j].x)*(p[i].x-p[j].x);
y=(p[i].y-p[j].y)*(p[i].y-p[j].y);
return sqrt(x+y);
}
int main()
{
int t,i;
double len;
while(~scanf("%d",&t)&&t)
{
len=MAX;
for(i=0;i<t;i++)scanf("%lf %lf",&p[i].x,&p[i].y);
sort(p,p+t,cmpx);
len=length(0,1);
for(i=1;i<t-1;i++)len=min(len,length(i,i+1));
sort(p,p+t,cmpy);
for(i=0;i<t-1;i++)len=min(len,length(i,i+1));
printf("%.2lf\n",len/2);
}
}
{
int t,i;
double len;
while(~scanf("%d",&t)&&t)
{
len=MAX;
for(i=0;i<t;i++)scanf("%lf %lf",&p[i].x,&p[i].y);
sort(p,p+t,cmpx);
len=length(0,1);
for(i=1;i<t-1;i++)len=min(len,length(i,i+1));
sort(p,p+t,cmpy);
for(i=0;i<t-1;i++)len=min(len,length(i,i+1));
printf("%.2lf\n",len/2);
}
}