题目描述
给定平面上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;
}