洛谷 1429 平面最近點對 貪心? 解題報告

題目描述

給定平面上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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章