分治法的典例

当练手了

奇妙的是。使用inplace_merge按说应该是O(n)的算法。可是用sort nlogn的算法反而更快

先上快排版

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath> using namespace std; const int SIZE = 10000+10;
const double INF = 100000; struct Point
{
double x,y;
}p[SIZE],q[SIZE]; int n; inline double dis(const Point a, const Point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
} bool cmpx(const Point &a, const Point &b)
{
return a.x<b.x;
} bool cmpy(const Point &a, const Point &b)
{
return a.y<b.y;
} double MinDis(int l,int r)
{
if(r-l<1)return INF;
if(r-l==1)return dis(p[r],p[l]); int m=(l+r)/2;
double d=min(MinDis(l,m),MinDis(m+1,r));
int left=l,right=r+1;
int i;
for(i=m;i>=l;i--)
if(p[i].x<p[m].x-d)
{
left=i+1;
break;
}
for(i=m;i<=r;i++)
if(p[i].x>p[m].x+d)
{
right=i;
break;
}
for(int i=left;i<right;i++)q[i]=p[i];
sort(q+left,q+right,cmpy);
int j;
double ret=d;
for(int i=left;i<right;i++)
{
for(j=i+1;j<right && q[j].y-q[i].y<d;j++)
{
ret=min(ret,dis(q[i],q[j]));
}
}
return ret; } int main()
{
double ans; while(scanf("%d",&n)&&n)
{
for(int i=0;i<n;i++)
{
scanf("%lf%lf",&p[i].x,&p[i].y);
}
sort(p,p+n,cmpx);
ans=MinDis(0,n-1);
if(ans>10000)printf("INFINITY\n");
else printf("%.4lf\n",ans);
} return 0;
}

再上归并

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath> using namespace std; const int SIZE = 10000+10;
const double INF = 100000;
#define dis(a,b) sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y))
#define Fabs(x) x>0?x:-x
const double eps=1e-9; struct Point
{
double x,y;
}p[SIZE],q[SIZE]; int n; /*inline double dis(const Point a, const Point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}*/ bool cmpx(const Point &a, const Point &b)
{
return a.x<b.x;
} bool cmpy(const Point &a, const Point &b)
{
return a.y<b.y;
} double MinDis(int l,int r)
{
if(r-l<1)return INF;
//if(r-l==1)return dis(p[r],p[l]); int m=(l+r)/2;
double d=min(MinDis(l,m),MinDis(m+1,r));
inplace_merge(p+l,p+m+1,p+r+1,cmpy);
int j,right=0;
for(int i=l;i<=r;i++)//0 <n
if(p[i].x >= p[m].x-d && p[i].x<=p[m].x+d)
q[right++]=p[i];
double ret=INF;
for(int i=0;i<right;i++)
{
for(j=i+1;j<right && q[j].y-q[i].y<d;j++)
{
ret=min(ret,dis(q[i],q[j]));
}
}
return min(d,ret);
} int main()
{
double ans; while(scanf("%d",&n)&&n)
{
for(int i=0;i<n;i++)
{
scanf("%lf%lf",&p[i].x,&p[i].y);
}
sort(p,p+n,cmpx);
ans=MinDis(0,n-1);
if(ans>=10000)printf("INFINITY\n");
else printf("%.4lf\n",ans);
} return 0;
}

uva 10245 近期点对问题的更多相关文章

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

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

  2. UVA 10245 - The Closest Pair Problem

    Problem JThe Closest Pair ProblemInput: standard inputOutput: standard outputTime Limit: 8 secondsMe ...

  3. uva 10245 The Closest Pair Problem_枚举

    题意:求任意两点之间的距离的最少一个距离 思路:枚举一下就可以了 #include <iostream> #include<cstdio> #include<cmath& ...

  4. UVa 10245 The Closest Pair Problem (分治)

    题意:给定 n 个点,求最近两个点的距离. 析:直接求肯定要超时的,利用分治法,先把点分成两大类,答案要么在左边,要么在右边,要么一个点在左边一个点在右边,然后在左边或右边的好求,那么对于一个在左边一 ...

  5. UVA 10245 The Closest Pair Problem【分治】

    题目链接: http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=21269 题意: 求平面最近点对. 分析: 经典问题. n比 ...

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

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

  7. UVA - 11354Bond最小生成树,LCA寻找近期公共祖先

    看懂题目意思.他的意思是求将全部的城市走一遍,危急度最小.而且给 你两个s,t后让你求在走的时候,从s到t过程中危急度最大的值,并输出它, 然后就是怎样攻克了,这个题目能够说简单,也能够说难 通过思考 ...

  8. UVA 10603 Fill(正确代码尽管非常搓,网上很多代码都不能AC)

    题目链接:option=com_onlinejudge&Itemid=8&page=show_problem&problem=1544">click here~ ...

  9. UVA 11423 - Cache Simulator (树状数组)

    UVA 11423 - Cache Simulator (树状数组) option=com_onlinejudge&Itemid=8&category=523&page=sho ...

随机推荐

  1. 创建android画笔程序的样例(有镜面效果)

    先上图: 关键是在检測到手指移动的时候用mPath.quadTo的方法,android sdk解释是: Add a quadratic bezier from the last point, appr ...

  2. Android输入法扩展之外接键盘中文输入

    大家想不想要这样一台Android  Surface平板,看着就过瘾吧. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSVRsZWFrcw==/font/ ...

  3. uva-211-The Domino Effect

    http://uva.onlinejudge.org/external/2/211.html http://uva.onlinejudge.org/external/2/211.pdf 题意:每一种骨 ...

  4. 上mongodb创建一些吸取的经验教训指数

    想来接触mongodb它已经快一年了,对于其指数已经积累了很多的经验,知识,以这个夜黑风高的优势,放mongodb总结一番吧. 一,索引介绍 mongodb具有两类索引,分别为单键索引和复合索引. 1 ...

  5. js编码、解码

    js对文字进行编码涉及3个函数:escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decodeURIComponent 1 ...

  6. linux使用进阶(一)

    本文依据<应该知道的Linux技巧>coolshell上的一篇文章提到的Linux技巧,结合自己掌握的情况进行扩展和总结得来.主要包含下面内容:     一.日常操作     二.数据处理 ...

  7. U5首次登录

    1.在Llinx中,大小写字母是不一样的东西. 2.date可以查看日期,date的正确格式是:date +%Y/%m/%d/%H/%M(左边这句话所想表达的意思是年的字母必须为大写,月的必须为小写. ...

  8. AlarmManager的学习与实现

    综述     这个类提供了一种使用系统提供的alarm服务.这个服务同意用户安排他们的应用程序在将来的某一个时间点执行.当设置的alarm响起,那么之前系统为这个alarm注冊的Intent就会自己主 ...

  9. swift 新功能介绍

    原文链接:http://www.cocoachina.com/applenews/devnews/2014/0617/8857.html 假设你和我一样,准备好好看看苹果的 Keynote,兴奋地准备 ...

  10. OpenCV 编程简单介绍(矩阵/图像/视频的基本读写操作)

    PS. 因为csdn博客文章长度有限制,本文有部分内容被截掉了.在OpenCV中文站点的wiki上有可读性更好.而且是完整的版本号,欢迎浏览. OpenCV Wiki :<OpenCV 编程简单 ...