uva10245-The Closest Pair Problem(平面上的点分治)
解析:平面上的点分治,先递归得到左右子区间的最小值d,
再处理改区间,肯定不会考虑哪些距离已经大于d的点对,
对y坐标归并排序,然后从小到大开始枚举更新d,对于某个点,
x轴方向只用考虑[x-d,x+d](x是分的中轴线),y轴方向只用考虑
[y-d,y](y是这个点的y值),因为d值一直在变小,所以这个矩形包
含的点数很少。
代码
#include<cstdio>
#include<cstring>
#include<string>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;
const double INF=1e9;
const int maxn=;
int N;
struct Po
{
double x,y;
Po(double x=,double y=):x(x),y(y){}
}po[maxn],B[maxn];
bool cmp(const Po& a,const Po& b)
{
if(a.x!=b.x) return a.x<b.x;
return a.y<b.y;
}
double dfs(int l,int r)
{
if(l>=r) return INF;
int mid=(l+r)/;
double x=po[mid].x;
double d=min(dfs(l,mid),dfs(mid+,r)); //先处理左右子区间
int ls=l,rs=mid+,k=l;
while(ls<=mid&&rs<=r) //归并排序
{
if(po[ls].y<=po[rs].y) B[k++]=po[ls++];
else B[k++]=po[rs++];
}
while(ls<=mid) B[k++]=po[ls++];
while(rs<=r) B[k++]=po[rs++];
for(int i=l;i<=r;i++) po[i]=B[i];
int Size=;
for(int i=l;i<=r;i++)
{
if(fabs(po[i].x-x)>=d) continue; //不考虑
for(int j=Size;j>=;j--)
{
double a=po[i].x-B[j].x;
double b=po[i].y-B[j].y;
if(b>=d) break;
d=min(d,sqrt(a*a+b*b)); //更新
}
B[++Size]=po[i];
}
return d;
}
int main()
{
while(scanf("%d",&N)!=EOF&&N)
{
double x,y;
for(int i=;i<=N;i++)
{
scanf("%lf%lf",&x,&y);
po[i]=Po(x,y);
}
sort(po+,po+N+,cmp);
double ans=dfs(,N);
if(ans<) printf("%.4f\n",ans);
else printf("INFINITY\n");
}
return ;
}
uva10245-The Closest Pair Problem(平面上的点分治)的更多相关文章
- UVA 10245 - The Closest Pair Problem
Problem JThe Closest Pair ProblemInput: standard inputOutput: standard outputTime Limit: 8 secondsMe ...
- UVA 10245 The Closest Pair Problem 最近点问题 分治算法
题意,给出n个点的坐标,找出两点间最近的距离,如果小于10000就输出INFINITY. 纯暴力是会超时的,所以得另辟蹊径,用分治算法. 递归思路将点按坐标排序后,分成两块处理,最近的距离不是在两块中 ...
- 2.11 2D平面最近点对问题[closest pair problem]
[本文链接] http://www.cnblogs.com/hellogiser/p/closest-pair-problem.html [题目] 给定平面上N个点的坐标,找出距离最近的两个点之间的距 ...
- UVA 10245 The Closest Pair Problem【分治】
题目链接: http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=21269 题意: 求平面最近点对. 分析: 经典问题. n比 ...
- UVa 10245 The Closest Pair Problem (分治)
题意:给定 n 个点,求最近两个点的距离. 析:直接求肯定要超时的,利用分治法,先把点分成两大类,答案要么在左边,要么在右边,要么一个点在左边一个点在右边,然后在左边或右边的好求,那么对于一个在左边一 ...
- Problem E: 平面上的点和线——Point类、Line类 (V)
Description 在数学上,平面直角坐标系上的点用X轴和Y轴上的两个坐标值唯一确定,两点确定一条线段.现在我们封装一个“Point类”和“Line类”来实现平面上的点的操作. 根据“append ...
- Problem D: 平面上的点和线——Point类、Line类 (IV)
Description 在数学上,平面直角坐标系上的点用X轴和Y轴上的两个坐标值唯一确定,两点确定一条线段.现在我们封装一个“Point类”和“Line类”来实现平面上的点的操作. 根据“append ...
- Problem C: 平面上的点和线——Point类、Line类 (III)
Description 在数学上,平面直角坐标系上的点用X轴和Y轴上的两个坐标值唯一确定,两点确定一条线段.现在我们封装一个“Point类”和“Line类”来实现平面上的点的操作. 根据“append ...
- Problem B: 平面上的点和线——Point类、Line类 (II)
Description 在数学上,平面直角坐标系上的点用X轴和Y轴上的两个坐标值唯一确定,两点确定一条线段.现在我们封装一个“Point类”和“Line类”来实现平面上的点的操作. 根据“append ...
随机推荐
- hdu2795--Billboard
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2795 摘要:有一块尺寸为h*w的矩形长板,要在上面贴1*wi的海报n张,选择贴海报的位置是:尽量高,同一 ...
- POJ 3378
题目链接 查找长度为5的上升序列总数 用的树状数组+高精度 用树状数组求在i前面比i小的数有几个 用的4个树状数组,A[i][j]表示长度为i的以j为结尾的个数,A[i][j]=A[i-1][1... ...
- AndroidStudio常见提示
Required:请求的是String字符串 . Found: et.getText()返回的是text.Editable
- 分享微博,qq空间,微信
<div class="share_class" ><div class="bdsharebuttonbox"> <a hr ...
- C#中唯一标识符GUID的一些知识点
概念 GUID: 即Globally Unique Identifier(全球唯一标识符) 也称作 UUID(Universally Unique IDentifier) . GUID是一个通过特定算 ...
- 转载:android——eclipse如何去除Ctrl+shift+R组合键查找到的.class文件
转载自:http://blog.csdn.net/virgilli/article/details/22500409 AS里面的build文件下一堆的.class 文件,当你要定位资源文件的时候,有些 ...
- 再说重写IHttpHandler,实现前后端分离
aspx页面第一次加载时,HttpHandler 里面是如何编译指定页面的呢?Framework提供了编译页面的API如下: BuildManager.CreateInstanceFromVirtua ...
- Java 日期与字符串的转换
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public cl ...
- oracle to_char()及to_date()函数使用
to_char(x[,format]) :将x转换成字符串,可以使用format参数来格式化字符串输出. to_date(x[,format]) :将字符串x转换成日期,可以使用format匹配要转换 ...
- 最简单轻便 的 sqlserver安装方式
网上有很多版本高的sqlserver 下下来就超级费劲 ,所以特意的想了个办法 ,就省时间 最高效率的安装 需要两个软件 我们假定安装 sqlserver 2005 1.SQLEXPR32_CHS ...