洛谷 1429 平面最近点对 贪心? 解题报告

来源:互联网 发布:cs.js.cn 编辑:程序博客网 时间:2024/06/08 19:22

题目描述

给定平面上n个点,找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的

输入输出格式

输入格式:

第一行:n;2≤n≤200000

接下来n行:每行两个实数:x y,表示一个点的行坐标和列坐标,中间用一个空格隔开。

输出格式:

仅一行,一个实数,表示最短距离,精确到小数点后面4位。

输入输出样例

输入样例#1: 复制

3
1 1
1 2
2 2

输出样例#1:

1.0000

说明

0<=x,y<=10^9

思路

我贪心的??
排序x与y然后暴力找
数据水???

代码

#include<cstdio>#include<algorithm>#include<cmath>using namespace std;const int N=200000+5;const int inf=0x3f3f3f3f;int n;double ans=inf;struct data{    int x,y;}point[N];double cal(int x1,int y1,int x2,int y2){return sqrt(pow((double)(x1-x2),2)+pow((double)(y1-y2),2));}inline bool cmp1(data a,data b){return a.x<b.x;}inline bool cmp2(data a,data b){return a.y<b.y;}int main(){    scanf("%d",&n);    for (int i=1;i<=n;i++)     scanf("%d%d",&point[i].x,&point[i].y);    sort(point+1,point+n+1,cmp1);    for (int i=1;i<n;i++)    ans=min(ans,cal(point[i].x,point[i].y,point[i+1].x,point[i+1].y));    sort(point+1,point+n+1,cmp2);    for (int i=1;i<n;i++)    ans=min(ans,cal(point[i].x,point[i].y,point[i+1].x,point[i+1].y));    printf("%.4lf",ans);    return 0;}