hdu 1007 求最近点对
来源:互联网 发布:公司网络改造方案 编辑:程序博客网 时间:2024/05/16 10:25
真想知道那些几百ms的是怎么写的
View Code
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
struct point {
double x,y;
}p[100010],q[100010];
double ans;
inline double dis(point a,point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
inline double min(double a,double b)
{
return a<b?a:b;
}
int cmpx(point a,point b)
{
return a.x<b.x;
}
int cmpy(point a,point b)
{
return a.y<b.y;
}
double divi(int l,int r)
{
if(l==r-1) return dis(p[l],p[r]);
if(l+2==r) return min(dis(p[l],p[r]),min(dis(p[l],p[l+1]),dis(p[l+1],p[r])));
int mid=(l+r)>>1;
ans=min(divi(l,mid),divi(mid+1,r));
int tot=0,i,j;
for(i=l;i<=r;i++)
{
if(p[i].x-p[mid].x<=ans&&p[mid].x-p[i].x<=ans)
q[tot++]=p[i];
}
sort(q,q+tot,cmpy);
for(i=0;i<tot;i++)
{
for(j=i+1;j<tot;j++)
{
if(q[j].y-q[i].y>=ans) break;
ans=min(ans,dis(q[i],q[j]));
}
}
return ans;
}
int main()
{
int n,i;
while(scanf("%d",&n),n)
{
n*=2;
for(i=0;i<n;i++)
{
scanf("%lf%lf",&p[i].x,&p[i].y);
}
sort(p,p+n,cmpx);
printf("%.2lf\n",divi(0,n-1)/2);
}
return 0;
}
- hdu 1007 求最近点对
- hdu 1007 求最近点对
- zoj 2107 || hdu 1007 求最近点对
- hdu 1007(分治法求最近点对)
- hdu 1007 Quoit Design(分治法求最近点对)
- hdu 1007 Quoit Design(分治求最近点对)
- HDU 1007 Quoit Design_二分法求最近点对
- HDU 1007 Quoit Design 分治法求最近点对
- hdu--1007(分治求二维最近点对)
- 【分治 求最近点对】hdu 1007 Quoit Design
- hdu 1007最近点对
- hdu 1007最近点对
- HDU-1007 最近点对
- hdu 1007最近点对
- HDU 1007 最近点对
- hdu 1007最近点对
- hdu 1007(最近点对)
- 求最近点对
- c
- poj 1201 intervals 我的第一个差分约束
- hdu 3932 最小覆盖圆 随机算法做法
- 一个最小 一个最大 poj 1379 hdu 3932
- poj 2420 求n个点的费马点 随机算法解决
- hdu 1007 求最近点对
- poj 1275 差分约束
- poj 3159 差分约束 用栈代替队列
- dijkstra + heap
- hdu 3440 差分约束
- hdu 1011 树形DP
- 金明的预算方案 有依赖的背包
- hdu 3792 树状数组
- 顺序存储实现队列 循环队列 好麻烦