最近点对一般想到枚举  ,一一枚举时间复杂度为n^2;枚举时候一些操作是多余的,有了分治算法的思想 ,把一些问题分个击破,再回到整体。

题目链接

以这道题为例,我们可以把他按照x轴的升序分成多个子区域先在子区域中求最近点距离,然后将相邻两个子区域合并,看看两个子区域中有没有更小的。大致思想就是这样的。

设计算法:递归将问题分成一小个问题。在找区域里面的最近点先将他按照x或y轴升或者降序排序这样找就可以省时间,详见代码,先看题,再看代码。

有错的地方还望指出,多多来hack

 #include <iostream>
#include <stdio.h>
#include <string.h>
#include <string>
#include <algorithm>
#include <stdlib.h>
#include <cmath> using namespace std;
const int MM = ;
const double INF=1e20;
struct Points
{
double x,y;
};
Points point[MM];
bool cmpx(Points x,Points y)
{
return x.x<y.x;
}
bool cmpy(int a,int b)
{
return point[a].y<point[b].y;
}
int n,index[MM];
double dist(Points a,Points b)//返回两点距离 double 类型
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double closest_point(int l,int r) //--------------------
{
double d=INF,d1,d2;
if(l==r) return d;
else if(l+==r) return dist(point[l],point[r]);
int mid=(l+r)>>;
d=min(closest_point(l,mid),closest_point(mid+,r));//递归分解问题,找到子区域中的最近点距离
/*****************找到后,以他们的最近距离来分割区间************************/
int i,j,cut=;
for(i=l; i<=r; i++)
{
if(fabs(point[i].x-point[mid].x)<d)
index[cut++]=i;
}
//在区间里找x宽度小于最近距离的把他的下标存在index数组里面 sort(index,index+cut,cmpy);
for(i=; i<cut; i++)
{
for(j=i+; j<cut; j++)
{
if(fabs(point[index[i]].y-point[index[j]].y)>=d)
break;
//sort之后,只要当前超过了了,后面的数字一点不可能比这个小,所以不找,省时间
d=min(dist(point[index[i]],point[index[j]]),d);
}
}
return d;
}
int main()
{
while(scanf("%d",&n)!=EOF&&n)
{
int i;
for(i=; i<n; i++)
{
scanf("%lf %lf",&point[i].x,&point[i].y);
}
sort(point,point+n,cmpx);
printf("%.2lf\n",closest_point(,n-)/);
}
return ;
}

hdu(1007) 最近点对 分治法的更多相关文章

  1. hdu 1007最近点对问题

    先说下题意,很简单,给n个点的坐标,求距离最近的一对点之间距离的一半.第一行是一个数n表示有n个点,接下来n行是n个点的x坐标和y坐标,实数. 这个题目其实就是求最近点对的距离.主要思想就是分治.先把 ...

  2. zoj 2107&&hdu 1007最近点对问题

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1107 Quoit Design Time Limit: 5 Seconds   ...

  3. hdu 1007 最近点对问题(Splay解法)

    为什么要写这个题..经典啊,当然,别以为我用分治做的,不过主要思想还是那神奇的六个点共存(一个h*2h的矩形中最多能放下多少个点使得两两距离不超过h) 其实我是在这里看到的 http://commun ...

  4. 用分治法解决最近点对问题:python实现

    最近点对问题:给定平面上n个点,找其中的一对点,使得在n个点的所有点对中,该点对的距离最小.需要说明的是理论上最近点对并不止一对,但是无论是寻找全部还是仅寻找其中之一,其原理没有区别,仅需略作改造即可 ...

  5. HDU 1007 Quoit Design(计算几何の最近点对)

    Problem Description Have you ever played quoit in a playground? Quoit is a game in which flat rings ...

  6. hdu 1007 Quoit Design 分治求最近点对

    Quoit Design Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  7. python编写PAT 1007 Maximum Subsequence Sum(暴力 分治法 动态规划)

    python编写PAT甲级 1007 Maximum Subsequence Sum wenzongxiao1996 2019.4.3 题目 Given a sequence of K integer ...

  8. (洛谷 P1429 平面最近点对(加强版) || 洛谷 P1257 || Quoit Design HDU - 1007 ) && Raid POJ - 3714

    这个讲的好: https://phoenixzhao.github.io/%E6%B1%82%E6%9C%80%E8%BF%91%E5%AF%B9%E7%9A%84%E4%B8%89%E7%A7%8D ...

  9. *HDU 1007 计算几何

    Quoit Design Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

随机推荐

  1. 数据库数据导出CSV文件,浏览器下载

    直接上代码: def download(request): # 从数据库查询数据 data_list = Info.objects.all() # 定义返回对象 response = HttpResp ...

  2. Struts2防止重复提交

    一般使用<interceptor-ref name="token"></interceptor-ref>或者<interceptor-ref name ...

  3. 《深入理解mybatis原理》 MyBatis缓存机制的设计与实现

    本文主要讲解MyBatis非常棒的缓存机制的设计原理,给读者们介绍一下MyBatis的缓存机制的轮廓,然后会分别针对缓存机制中的方方面面展开讨论. MyBatis将数据缓存设计成两级结构,分为一级缓存 ...

  4. 发布ios应用程序

    详见文档 AppDistributionGuide Submit and Release Your App 首先,需要登入itunes connect并且输入必要的信息更改app状态为 waiting ...

  5. Cocoa开发中, 如何用全局变量

    比如在tabbar的开发中,可以某个页面的数据需要在back到此页面后依然有效. 可以用 appDelegate 这个对象来创建你的全局数据 这个内建的对象,在 APP 启动时产生,在 APP 退出时 ...

  6. git 更新远程分支

    使用git的时候,有时候会出现远端更新了一个分支,但是从本地想checkout一个远程分支时,会出现如下错误: fatal: git checkout: updating paths is incom ...

  7. 最新的hustoj搭建姿势

    试着照某度上的教程搭了一下hustoj,出了一些问题,之前的搭建姿势很多已经不适用了,重新整理一下思路,方法二简单粗暴: 方法一: 首先虚拟机安装了Elementory OS (基于Ubuntu的衍生 ...

  8. IntelliJ IDEA cannot resolved 处理

    IntelliJ IDEA cannot resolved 处理 学习了:https://stackoverflow.com/questions/21577573/intellij-idea-can- ...

  9. wiki平台工具

    1.  confluence  评点: 好用,与world类似.模板多.

  10. insertion-sort-list——链表、插入排序、链表插入

    Sort a linked list using insertion sort. PS:需要考虑left为head且只有一个数时,此时left->==NULL,若right<left则应更 ...