标签:http os io for 代码 ar line amp
题目: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; }
uva10245 - The Closest Pair Problem(暴力+剪枝),布布扣,bubuko.com
uva10245 - The Closest Pair Problem(暴力+剪枝)
标签:http os io for 代码 ar line amp
原文地址:http://blog.csdn.net/u012997373/article/details/38293385