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