题目:uva10245 - The Closest Pair Problem(暴力+剪枝)
题目大意:给出N个点,求这些点中最小的两点距离。
解题思路:把这些点中两两之间的距离都算出来,这样的复杂度是O(n^2),会超时,所以加了一个减枝。
先将所有的点按照x坐标排序。然后在计算的过程中,如果发现要计算的这两点的X坐标之差的绝对值已经大于等于当前的最小值,那么说明后面的点计算距离一定比这个最小值要大。
这题的正解貌似是分治法,可惜没看懂。
代码:
#include <stdio.h>
#include <algorithm>
#include <stdlib.h>
#include <math.h>
using namespace std;
const int MAXN = 10005;
const double MLen = 10000;
const double esp = 1e-9;
struct NODE {
double x, y;
}node[MAXN];
int cmp (const NODE &a, const NODE &b) {
return a.x < b.x;
}
double dist (int i, int j) {
double px = fabs (node[i].x - node[j].x);
double py = fabs (node[i].y - node[j].y);
return sqrt (px * px + py * py);
}
int main () {
int n;
double minLen, d;
while (scanf ("%d", &n) && n) {
for (int i = 0; i < n; i++)
scanf ("%lf%lf", &node[i].x, &node[i].y);
sort (node, node + n, cmp);
minLen = MLen;
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
// printf ("%lf %lf\n", node[j].x - node[i].x - minLen,esp);
if (node[j].x - node[i].x - minLen >= -esp)
break;
d = dist(i, j);
// printf (".4lf\n", d);
if (d < minLen)
minLen = d;
}
}
// printf ("%.4lf\n", minLen);
if (fabs (minLen - MLen) <= esp)
printf ("INFINITY\n");
else
printf ("%.4lf\n", minLen);
}
return 0;
}