问题描述:

源码:

经典问题——最近邻问题,标准解法

#include"iostream"
#include"algorithm"
#include"cmath"
using namespace std; struct Point
{
double x;
double y;
}; Point S[100000];//不使用全局变量可能会超内存 bool cmpPointX(Point a, Point b)
{
return a.x > b.x;
} bool cmpPointY(Point a, Point b)
{
return a.y > b.y;
} double EfficientClosestPair(Point *P, Point *Q, int start, int n)
{
if(n <= 3)
{
double result;
result = (P[start].x - P[start+1].x)*(P[start].x - P[start+1].x) + (P[start].y - P[start+1].y) * (P[start].y - P[start+1].y);
if(n == 3)
{
double tmp = (P[start].x - P[start+2].x)*(P[start].x - P[start+2].x) + (P[start].y - P[start+2].y) * (P[start].y - P[start+2].y);
if(tmp < result)result = tmp;
tmp = (P[start+1].x - P[start+2].x)*(P[start+1].x - P[start+2].x) + (P[start+1].y - P[start+2].y) * (P[start+1].y - P[start+2].y);
if(tmp < result)result = tmp;
}
return result;
}
else
{
int half = n / 2;
double d1 = EfficientClosestPair(P, Q, start, half);
double d2 = EfficientClosestPair(P, Q, start + half, n - half);
double d = d1 < d2 ? d1 : d2;
double m = P[start + half - 1].x;
int count = 0;
double tmp;
for(int i = start; i < start + n; i++)
{
tmp = Q[i].x - m;
if(tmp < 0)tmp = - tmp;
if(tmp < d)count++;
}
double dminsq = d;
if(count > 1)
{
//Point *S = new Point[count];
for(int i = start, j = 0; i < start + n; i++)
{
tmp = Q[i].x - m;
if(tmp < 0)tmp = - tmp;
if(tmp < d)
{
S[j].x = Q[i].x;
S[j].y = Q[i].y;
j++;
}
}
int k;
for(int i = 0; i < count - 1; i++)
{
k = i + 1;
while(k < count && (S[k].y - S[i].y)*(S[k].y - S[i].y) < dminsq)
{
dminsq = min((S[k].x - S[i].x)*(S[k].x - S[i].x) + (S[k].y - S[i].y)*(S[k].y - S[i].y), dminsq);
k++;
}
}
} return dminsq; }
} int main()
{
int n;
Point *P, *Q;
cout.precision(2);
cout.setf(ios::fixed);
P = new Point[100000];
Q = new Point[100000];
while(scanf("%d", &n) != EOF)
{
if(n == 0)break;
for(int i = 0; i < n; i++)
{
scanf("%lf %lf", &P[i].x,&P[i].y);
Q[i].x = P[i].x;
Q[i].y = P[i].y;
}
if(n <= 3)
{
cout<<sqrt(EfficientClosestPair(P, Q, 0, n)) / 2<<endl;
}
else
{
sort(P, P+n, cmpPointX);//使用qsort可能会超时
sort(Q, Q+n, cmpPointY);
cout<<sqrt(EfficientClosestPair(P, Q, 0, n)) / 2<<endl;
}
}
return 0;
}

  

HD-ACM算法专攻系列(15)——Quoit Design的更多相关文章

  1. HD-ACM算法专攻系列(23)——Crixalis's Equipment

    题目描述: AC源码:此次考察贪心算法,解题思路:贪心的原则是使留下的空间最大,优先选择Bi与Ai差值最大的,至于为什么?这里用只有2个设备为例,(A1,B1)与(A2,B2),假设先搬运A1,搬运的 ...

  2. HD-ACM算法专攻系列(21)——Wooden Sticks

    题目描述: AC源码: 此题考查贪心算法,解题思路:首先使用快速排序,以w或l按升序排序(注意相等时,应按另一值升序排序),这样就将二维变量比较,变为了一维的,排好序的一边就不需要去管了,只需要对未排 ...

  3. HD-ACM算法专攻系列(22)——Max Sum

    问题描述: AC源码: 此题考察动态规划,解题思路:遍历(但有技巧),在于当前i各之和为负数时,直接选择以第i+1个为开头,在于当前i各之和为正数时,第i个可以不用作为开头(因为前i+1个之和一定大于 ...

  4. HD-ACM算法专攻系列(20)——七夕节

    问题描述: AC源码: /**/ #include"iostream" #include"cmath" using namespace std; int mai ...

  5. HD-ACM算法专攻系列(19)——Leftmost Digit

    问题描述: AC源码: 解题关键是,数据很大,不能强算,需要使用技巧,这里使用科学计算法,令N^N=a*10^n ,取对数后变为 N*log10(N)=log10(a)+n,令x = log10(a) ...

  6. HD-ACM算法专攻系列(18)——Largest prime factor

    题目描述: 源码: 需要注意,若使用cin,cout输入输出,会超时. #include"iostream" #include"memory.h" #defin ...

  7. HD-ACM算法专攻系列(17)——find your present (2)

    题目描述: 源码: #include"iostream" #include"string" using namespace std; bool IsFirstH ...

  8. HD-ACM算法专攻系列(16)——考试排名

    问题描述: 源码: 主要要注意输出格式. #include"iostream" #include"iomanip" #include"algorith ...

  9. HD-ACM算法专攻系列(14)——find your present (2)

    问题描述: 源码: #include"iostream" #include"algorithm" using namespace std; bool cmp(i ...

随机推荐

  1. Sublime Text3 插件记录

    插件官网 其他插件安装之前,先安装 Package Control: 快捷键Ctrl+`或View > Show Console打开控制台. 输入以下 Python 代码,回车. import ...

  2. ProgressDialog的关键几个函数

    进度条对话框在开发是常见的一种工具,只要注意以下几点,就可以轻松使用. ProgressDialog.setMax(MAX_PROGRESS);  //设置最大值,可以如下定义一个常值 //priva ...

  3. iOS中容易混淆的知识点(持续更新中)

    1.成员变量和属性的区别 @interface Person : NSObject { NSString *_sex; } @property (nonatomic, copy) NSString * ...

  4. in 与 exist , not in 与 not exist

    in和exists in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询.一直以来认为exists比in效率高的说法是不准确的. 如果查询的两个 ...

  5. Programming Recipes

    Recipes是从一本书上看来的,即有诀窍又有食谱的意思.这里想记一些工作中遇到的问题和解决方法,说决窍有点过了,说食谱照单做又不足,所以Recipe这个词两个意思都有混合起来正合适. 1.Windo ...

  6. Kattis - iBoard

    iBoard After years of success with a single-button mouse, a well known computer company has decided ...

  7. android学习路线总结

    感谢安辉作者,学习路线  https://www.cnblogs.com/yishaochu/p/5436094.html https://www.cnblogs.com/jycboy/p/60666 ...

  8. HH的项链 树状数组动态维护前缀

    #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const ...

  9. Airtest多设备跑

    一.   一个脚本对应一台设备 核心点:组织运行命令:将组织好的命令传到pool进程池(注意:是进程池,不是线程池,python的线程池不是同步执行,是按序执行) 以下不需要看,为私人项目备份目的. ...

  10. java中String和int的互相转化

    1. String 转 int 方式1:Integer.parseInt(); 方式2: Integer.valueOf(myStr).intValue(); 2.  int 转String 方式1: ...