分治法求近期点对

递归将点不断分成小组。计算最短距离。此时的最短距离不过两点都属两块的某一块(这里的切割点是mid点)。

还须要考虑两点分属两块的情况。

这时对于选点则把范围缩小到了以mid为中心。

再将距离mid点x轴2*mindist范围点考虑在内。在这些点中,再取mid点,留下那些

y的距离不大于middist 的点进行距离计算。

PS:刚開始min函数写错了。写成了max,一直tle.使用max则会导致选取的点越来越多。TLE则就不奇怪了。

对于使用递归方法实现分治。事实上质使用了小范围内得到的结果会缩小总体范围内的搜索空间。递归函数要有范围參数噢。

递归的直观理解能够是1 2 3 等简单情况完后得到的结果返回,组拼全局解。

#include <iostream>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int maxn=100005;
int n;
struct P
{
double x,y;
}p[maxn],ans[maxn];
double min(double a,double b){return a<b?a:b;}
bool cmpx(struct P a,struct P b){return a.x<b.x;}
bool cmpy(struct P a,struct P b){return a.y<b.y;}
double dist(struct P a,struct P b){return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}
double solve(int l,int r)
{
if(l+1==r)
return (dist(p[l],p[r]));
else if(l+2==r)
return min(dist(p[l],p[l+1]),min(dist(p[l+1],p[r]),dist(p[r],p[l])) );
int mid=(l+r)>>1;
double res=min(solve(l,mid),solve(mid+1,r));//这里避免了==mid 的情况
int cnt=0,i,j;
for(i=l;i<=r;i++)
{
if(fabs(p[i].x-p[mid].x)<=res)
ans[cnt++]=p[i];
}
sort(ans,ans+cnt,cmpy);
for( i=0;i<cnt;i++)
for( j=i+1;j<cnt;j++)
{
if(ans[j].y-ans[i].y>=res) break;
res=min(res,dist(ans[i],ans[j]));
}
return res;
}
int main()
{
while(scanf("%d",&n),n)
{
int i;
for(i=0;i<n;i++) scanf("%lf%lf",&p[i].x,&p[i].y);//输入点
sort(p,p+n,cmpx);//按x排序
double res=solve(0,n-1);
printf("%.2lf\n",res/2);
}
return 0;
}

HDU 1007 近期点对的更多相关文章

  1. HDU 1007 Quoit Design(二分+浮点数精度控制)

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

  2. 【HDU 1007】Quoit Design

    http://acm.hdu.edu.cn/showproblem.php?pid=1007 最近欧式距离模板题. 用分治大法(分治的函数名用cdq纯属个人习惯_(:з」∠)_) 一开始狂M. 后来判 ...

  3. HDU 1007 Quoit Design(经典最近点对问题)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1007 Quoit Design Time Limit: 10000/5000 MS (Java/Oth ...

  4. 【HDU 1007】 Quoit Design

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=1007 [算法] 答案为平面最近点对距离除以2 [代码] #include <algorith ...

  5. HDU 1007 Quoit Design 平面内最近点对

    http://acm.hdu.edu.cn/showproblem.php?pid=1007 上半年在人人上看到过这个题,当时就知道用分治但是没有仔细想... 今年多校又出了这个...于是学习了一下平 ...

  6. HDU 1007:Quoit Design(分治求最近点对)

    http://acm.hdu.edu.cn/showproblem.php?pid=1007 题意:平面上有n个点,问最近的两个点之间的距离的一半是多少. 思路:用分治做.把整体分为左右两个部分,那么 ...

  7. hdu 1007 Quoit Design(分治)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1007 题意:给出n个点求最短的两点间距离除以2. 题解:简单的分治. 其实分治就和二分很像二分的写df ...

  8. Hdu 1007 最近点对

    题目链接 Quoit Design Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  9. *HDU 1007 计算几何

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

随机推荐

  1. Arcgis镶嵌数据集java代码操作

    转自:http://www.cdtarena.com/javapx/201307/9105.html 镶嵌数据集结合了之前arcgis管理影像的栅格目录和栅格数据集,为解决海量影像管理提供了很好的方案 ...

  2. SignalR系列教程:服务器广播与主动数据推送

    本篇是本系列入门篇的最后一遍,由于工作关系,接触SignalR的时间不是很多.等下次有空的话我会写一个利用“SignalR”开发一个在线聊天室的系列博文.近期的话我更偏向于更新框架设计相关的文章,到时 ...

  3. Qt国际化(Q_DECLARE_TR_FUNCTIONS() 宏给非Qt类添加翻译支持,以前没见过QTextEncoder和QTextDecoder和QLibraryInfo::location()和QEvent::LanguageChange)

    Internationalization with Qt 应用程序的国际化就是使得程序能在国际间可用而不仅仅是在本国可用的过程. Relevant Qt Classes andAPIs 以下的类支持Q ...

  4. 转:onConfigurationChanged的作用

    API原文说明:android:configChangesLists configuration changes that the activity will handle itself. When ...

  5. 【译】在Asp.Net中操作PDF – iTextSharp-列表

    原文 [译]在Asp.Net中操作PDF – iTextSharp-列表 在前文中,我们已经知道了如何利用iTextSharp创建PDF文档,设置字体样式和风格.本文开始讲述iTextSharp中的有 ...

  6. Bertelsmann Asia Investments, 简称BAI

    聚焦龙宇:贝塔斯曼的中国风险投资之路 _财经_腾讯网 贝塔斯曼亚洲投资基金(Bertelsmann Asia Investments, 简称BAI )

  7. ※数据结构※→☆线性表结构(list)☆============单向循环链表结构(list circular single)(四)

    循环链表是另一种形式的链式存贮结构.它的特点是表中最后一个结点的指针域指向头结点,整个链表形成一个环. 单循环链表——在单链表中,将终端结点的指针域NULL改为指向表头结点或开始结点即可. 循环链表的 ...

  8. BZOJ 3173: [Tjoi2013]最长上升子序列( BST + LIS )

    因为是从1~n插入的, 慢插入的对之前的没有影响, 所以我们可以用平衡树维护, 弄出最后的序列然后跑LIS就OK了 O(nlogn) --------------------------------- ...

  9. TNetHttpClient支持异步访问(Delphi 10.1 Berlin,红鱼儿的博客)

    Delphi 10.1进一步改进自Delphi 10带来的Http访问控件TNetHttpClient,支持异步访问,同时增加ConnectionTimeout及ResponseTimeout两个超时 ...

  10. 列举一些常见的Python HTTP服务器

    要使 Python 写的程序能在 Web 上被访问,还需要搭建一个支持 Python 的 HTTP 服务器.下面列举一些常见的 Python HTTP 服务器,以及它们目前的大致发展情况,以便用户的对 ...