ZOJ 2107 HDU 1007 Quoit Design(最近点对)

来源:互联网 发布:1元域名注册 编辑:程序博客网 时间:2024/06/10 16:43

最近点对的裸题

利用分治去搞搞即可

代码:

#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;const int N = 100005;struct Point {    double x, y;    void read() {        scanf("%lf%lf", &x, &y);    }};bool cmpx(Point a, Point b) {    return a.x < b.x;}bool cmpy(Point a, Point b) {    return a.y < b.y;}double dis(Point a, Point b) {    double dx = a.x - b.x;    double dy = a.y - b.y;    return sqrt(dx * dx + dy * dy);}int n;Point p[N], tmp[N];int tn;double gao(double ans) {    sort(tmp, tmp + tn, cmpy);    for (int i = 0; i < tn; i++) {        for(int j = i + 1; j < tn && tmp[j].y - tmp[i].y < ans; j++) {            ans = min(ans, dis(tmp[i], tmp[j]));        }    }    return ans;}double ClosePoint(int l, int r) {    if (r - l + 1 <= 3) {        tn = 0;        for (int i = l; i <= r; i++)            tmp[tn++] = p[i];        return gao(1e20);    }    int mid = (l + r)>>1;    double s = min(ClosePoint(l, mid), ClosePoint(mid + 1, r));    tn = 0;    for (int i = l; i <= r; i++) {        if (fabs(p[i].x - p[mid].x) < s)            tmp[tn++] = p[i];    }    return gao(s);}int main() {    while (~scanf("%d", &n) && n) {        for (int i = 0; i < n; i++)            p[i].read();        sort(p, p + n, cmpx);        printf("%.2f\n", ClosePoint(0, n - 1) / 2);    }    return 0;}


0 0
原创粉丝点击