【poj 3714 / hdu 1007 /uva 10245】经典题 平面上最近的点对
2016-07-29 10:03
411 查看
【问题描述】
给定平面上n个点,找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的。
【输入格式】
第一行:n;
接下来n行:每行两个实数:x y,表示一个点的行坐标和列坐标,中间用一个空格隔开。
【输出格式】
仅一行,一个实数,表示最短距离,精确到小数点后面4位。
【输入样例】
3
1 1
1 2
2 2
【输出样例】
1.0000
【数据范围】
对于50%的数据有:2 ≤ n ≤ 5000
对于100%的数据有:1 ≤ n ≤ 100000 , 0 ≤ x,y ≤ 1000000000
【来源】
poj 3714 / hdu 1007 /uva 10245
给定平面上n个点,找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的。
【输入格式】
第一行:n;
接下来n行:每行两个实数:x y,表示一个点的行坐标和列坐标,中间用一个空格隔开。
【输出格式】
仅一行,一个实数,表示最短距离,精确到小数点后面4位。
【输入样例】
3
1 1
1 2
2 2
【输出样例】
1.0000
【数据范围】
对于50%的数据有:2 ≤ n ≤ 5000
对于100%的数据有:1 ≤ n ≤ 100000 , 0 ≤ x,y ≤ 1000000000
【来源】
poj 3714 / hdu 1007 /uva 10245
#include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #define maxn 100005 #define inf 1111111111 using namespace std; int n; struct data{ int x,y; }p[maxn],c[maxn]; bool cmpx(data a,data b){ return a.x<b.x; } bool cmpy(data a,data b){ return a.y<b.y; } double getd(int i,int j){ double a=p[i].x-p[j].x; double b=p[i].y-p[j].y; return sqrt(a*a+b*b); } double getd2(int i,int j){ double a=c[i].x-c[j].x; double b=c[i].y-c[j].y; return sqrt(a*a+b*b); } double calc(int x,int y){ if(x>=y)return inf; if(x==y-1)return getd(x,y); int m=(x+y)/2; double dl=calc(x,m); double dr=calc(m+1,y); double d=min(dl,dr); int k=0; for(int i=x;i<=y;i++) if(abs(p[i].x-p[m].x)<d)c[++k]=p[i]; double t=inf; sort(c+1,c+k+1,cmpy); for(int i=1;i<k;i++) for(int j=i+1;j<=k;j++){ if(c[j].y-c[i].y>=d)break; t=min(t,getd2(i,j)); } return min(t,d); } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d%d",&p[i].x,&p[i].y); sort(p+1,p+n+1,cmpx); double ans=calc(1,n); printf("%.4lf",ans); return 0; } // 呵呵,就是求距离两种数组C,P不一样…卡一年 //这尼玛都能超时…… 改了sort的位置就不超了……
相关文章推荐
- 初学ACM - 组合数学基础题目PKU 1833
- POJ ACM 1001
- POJ ACM 1002
- 1611:The Suspects
- POJ1089 区间合并
- POJ 2159 Ancient Cipher
- POJ 2635 The Embarrassed Cryptographe
- POJ 3292 Semi-prime H-numbers
- POJ 2773 HAPPY 2006
- POJ 3090 Visible Lattice Points
- POJ-2409-Let it Bead&&NYOJ-280-LK的项链
- POJ-1695-Magazine Delivery-dp
- POJ1523 SPF dfs
- POJ-1001 求高精度幂-大数乘法系列
- POJ-1003 Hangover
- POJ-1004 Financial Management
- [数论]poj2635__The Embarrassed Cryptographer
- [二分图匹配]poj2446__Chessboard
- POJ1050 最大子矩阵和
- 用单调栈解决最大连续矩形面积问题