http://acm.hdu.edu.cn/showproblem.php?pid=1007

直接见代码吧。不过这个是N*logN*logN的

尽管如此,我怎么感觉我的比他们的还快???

 #include <map>
#include <set>
#include <stack>
#include <queue>
#include <cmath>
#include <ctime>
#include <vector>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define mem0(a) memset(a,0,sizeof(a))
#define mem1(a) memset(a,-1,sizeof(a))
#define lson k<<1, L, mid
#define rson k<<1|1, mid+1, R //typedef long long LL;
const double eps = 1e-;
const int MAXN = ;
const int MAXM = ; double min(double a, double b) { return a < b ? a : b; } struct Point
{
double x;
double y;
};
int numOfPoint;
Point points[MAXN], TempMerge[MAXN];
Point ansPoint1, ansPoint2;
double closest; void initPoints()
{
mem0(points); closest = INF;
for(int i=;i<numOfPoint;i++)
{
scanf("%lf %lf", &points[i].x, &points[i].y);
}
} int cmp_X(Point A, Point B)
{
if(A.x != B.x) return A.x < B.x;
return A.y < B.y;
} int cmp_Y(Point A, Point B)
{
if(A.y != B.y) return A.y < B.y;
return A.x < B.x;
}
#define distance(A, B) sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y))
//double distance(Point &A, Point &B)
//{
// return sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y));
//} double calculateTheClosest(int low, int high)
{
for(int i=low;i<=high;i++)TempMerge[i-low] = points[i];
sort(TempMerge, TempMerge+(high-low+), cmp_Y);
for(int i=;i<high-low;i++)
{
for(int j=i+;j<=i+ && j<=high-low;j++)
{
double calc = distance(TempMerge[i], TempMerge[j]);
if(calc < closest)
{
closest = calc;
ansPoint1 = TempMerge[i];
ansPoint2 = TempMerge[j];
}
}
}
return closest;
} double findTheClosest(int left, int right)
{
if(left>=right) return INF;
int mid = (left+right)>>;
double leftAns = findTheClosest(left, mid);
double rightAns = findTheClosest(mid+, right);
double ans = min(leftAns, rightAns);
int low = left, high = mid+;
while(distance(points[low], points[mid])>ans)low++;
while(high <= right && distance(points[high], points[mid])<=ans)high++;
ans = min(ans, calculateTheClosest(low, high-));
return ans;
} int main()
{
while(scanf("%d", &numOfPoint) == && numOfPoint)
{
initPoints();
sort(points, points+numOfPoint, cmp_X);
double ans = findTheClosest(, numOfPoint-);
printf("%.2lf\n", ans/);
//printf("The Point(%.2lf, %.2lf) and Point(%.2lf, %.2lf) is %lf\n", ansPoint1.x,ansPoint1.y,ansPoint2.x,ansPoint2.y,ans);
}
return ;
}

HDU1007最近点对(分治)的更多相关文章

  1. Quoit Design(最近点对+分治)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1007 Quoit Design Time Limit: 10000/5000 MS (Java/Oth ...

  2. HDU1007(最近点对)

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

  3. 平面最近点对(分治nlogn)

    平面最近点对,是指给出平面上的n个点,寻找点对间的最小距离 首先可以对按照x为第一关键字排序,然后每次按照x进行分治,左边求出一个最短距离d1,右边也求出一个最短距离d2,那么取d=min(d1, d ...

  4. HDU1007 Quoit Design 【分治】

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

  5. UVA 10245 The Closest Pair Problem 最近点问题 分治算法

    题意,给出n个点的坐标,找出两点间最近的距离,如果小于10000就输出INFINITY. 纯暴力是会超时的,所以得另辟蹊径,用分治算法. 递归思路将点按坐标排序后,分成两块处理,最近的距离不是在两块中 ...

  6. Quoit Design(hdu1007)最近点对问题。模版哦!

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

  7. HDU 1007 平面上最近点对 分治

    思路: 分治 套路题 //By SiriusRen #include <cmath> #include <cstdio> #include <algorithm> ...

  8. <算法竞赛入门经典> 第8章 贪心+递归+分治总结

    虽然都是算法基础,不过做了之后还是感觉有长进的,前期基础不打好后面学得很艰难的,现在才慢慢明白这个道理. 闲话少说,上VOJ上的专题训练吧:http://acm.hust.edu.cn/vjudge/ ...

  9. ACM模板_axiomofchoice

    目录 语法 c++ java 动态规划 多重背包 最长不下降子序列 计算几何 向量(结构体) 平面集合基本操作 二维凸包 旋转卡壳 最大空矩形 | 扫描法 平面最近点对 | 分治 最小圆覆盖 | 随机 ...

随机推荐

  1. memcached内存管理及key value长度限制

    1)什么是内存碎片?内存是大小有限的资源.例如把内存比作一张小床,来了一个小伙伴,可以睡下,再来一个小伙伴也能睡下.现在两个人了,他们点了差不多的大小的位置(资源),位置还有剩下.然后再来一个小胖子, ...

  2. mokoid android open source HAL hacking in a picture

    /************************************************************************** * mokoid android HAL hac ...

  3. (六)6.17 Neurons Networks convolutional neural network(cnn)

    之前所讲的图像处理都是小 patchs ,比如28*28或者36*36之类,考虑如下情形,对于一副1000*1000的图像,即106,当隐层也有106节点时,那么W(1)的数量将达到1012级别,为了 ...

  4. 【英语】Bingo口语笔记(1) - Hold

    how are you holding up? 你还撑得住吧?你还好吧?撑住太不容易了吧!

  5. WebView增加一个水平Progress,位置、长相随意

    实际效果可以参看微信的web页面进度条 本质就是通过addView及对WebView 页面进度进行监听 先看看这个自定义的DrawableId,我们参照系统默认实现的方法写一个自己的   <la ...

  6. 使用模板时 error LNK2019: 无法解析的外部符号

    类模板是c++编译器指令 说明了如何生成类和成员函数 除非编译器实现了新的关键字export关键字 否则将模板成员函数放置在一个独立的实现文件中 将无法运行 因为模板不是函数 他们不能单独编译 模板必 ...

  7. 【转】WPF MultiBinding 和 IMultiValueConverter

    WPF MultiBinding 和 IMultiValueConverter 时间 2015-02-02 19:43:00  博客园精华区 原文  http://www.cnblogs.com/wo ...

  8. object does not contain a definition for get_range

      原因[1] 在VS2012中调用COM Interop DLL操作Excel通过get_Range去获取Range时,会发生Object does not contain a definition ...

  9. 更新的packages.config所有的软件包?

    1. 你NuGet.exe的恢复你的包.运行的每个项目. nuget install packages.config 或用NuGet的2.7可以恢复所有包中的行. nuget restore Your ...

  10. DzzOffice结合office web Apps私有部署的实例

    很多朋友都想在自己使用的DzzOffice中,调用本地部署的office web Apps server. 下面我就直接从头到尾的将部署全部过程分享给大家. 准备条件:两台服务器,配置稍高点,以免卡顿 ...