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