题解 P1257 【平面上的最接近点对】
思路
因为题目范围是10000,所以我们枚举两个点,求他的距离。时间复杂度是O(n^2)这样是不行的,但因为由i=x点,j=y点 与 i=y点,j=x点是一样的,所以只要把枚举压缩一下,九个一得到时间复杂度为O(n(n-1)/2)的算法,是可以通过的。
枚举代码如下:
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
minn=min(minn,sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));//x[i]是第i个点的x坐标,y[i]是滴i个点的y坐标。
代码很短,只有二十几行:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
double minn=2147483647,x[10010],y[10010];//因为输出的是小数,所以我们要用double类型存储。
int n,cnt;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%lf%lf",&x[i],&y[i]);
}
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
minn=min(minn,sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])));//计算距离并与之前的取最小值。
}
}
printf("%.4lf",minn);//输出保留四位。
return 0;
}