您的位置:首页 > 其它

【几何】HDU 1007 Quoit Design 最近点对

2014-08-28 18:25 369 查看
模板

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include<math.h>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
#include<queue>
#include<stack>
#include<vector>
#include<deque>
#include<set>
#include<map>
struct Q
{
double x, y;
} q[100001], sl[10], sr[10];
int cntl, cntr, lm, rm;
double ans;
int cmp(Q p1, Q p2)
{
return p1.x<p2.x;
}
double CalDis(double x1, double y1, double x2, double y2)
{
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
void MinDis(int l, int r)
{
if (l==r) return;
double dis;
if (l+1==r)
{
dis=CalDis(q[l].x,q[l].y,q[r].x,q[r].y);
if (ans>dis) ans=dis;
return;
}
int mid=(l+r)>>1, i, j;
MinDis(l,mid);
MinDis(mid+1,r);
lm=mid+1-5;
if (lm<l) lm=l;
rm=mid+5;
if (rm>r) rm=r;
cntl=cntr=0;
for (i=mid; i>=lm; i--)
{
if (q[mid+1].x-q[i].x>=ans)break;
sl[++cntl]=q[i];
}
for (i=mid+1; i<=rm; i++)
{
if (q[i].x-q[mid].x>=ans)break;
sr[++cntr]=q[i];
}
for (i=1; i<=cntl; i++)
for (j=1; j<=cntr; j++)
{
dis=CalDis(sl[i].x,sl[i].y,sr[j].x,sr[j].y);
if (dis<ans) ans=dis;
}
}
int main (void)
{
int n, i;
while (scanf("%d",&n)==1&&n)
{
for (i=1; i<=n; i++)
scanf("%lf %lf", &q[i].x,&q[i].y);
sort(q+1,q+n+1,cmp);
ans=CalDis(q[1].x,q[1].y,q[2].x,q[2].y);
MinDis(1,n);
printf("%.2lf\n",ans/2.0);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: