利用分治法求二维区间若干个点中两点的最短距离

戳这里看题目

这道题我虽然不会,但是看了大佬的代码并运行,但!!是为什么我的运行时间要多200+ms!!!!
难道是上天嫉妒我的英才 ?? 还是人傻自带大常数??

利用的是归并的思想,最小的距离无非是左半区,或者是右半区, 或者是横跨左右半区。

PS: 利用排序做了一下优化

#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>

using namespace std;

const int N = 100010;
const double INF = 1e9 + 100;

struct E
{
    double x, y;
}point[N];

bool cmpx(E a, E b)
{
    return a.x < b.x;
}

bool cmpy(E a, E b)
{
    return a.y < b.y;
}

double dis(E a, E b)
{
    return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}
double get_distance(int l, int r)
{
    if(l + 1 == r) return dis(point[l], point[r]);
    
    else if(l == r) return INF;
    
    vector<E> ls, rs;
    
    int mid = l + r >> 1;
    double d = min(get_distance(l, mid), get_distance(mid + 1, r));
    
    //cout << d << endl;
    
    for(int i = l; i <= mid ; i ++)
    {
        if(fabs(point[mid].x - point[i].x) <= d) ls.push_back(point[i]);
    }
    
    for(int i = mid + 1; i <= r; i ++)
    {
        if(fabs(point[i].x - point[mid].x) <= d) rs.push_back(point[i]);
    }
    
    sort(ls.begin(), ls.end(), cmpy);
    
    sort(rs.begin(), rs.end(), cmpy);
    
    
    int pos = 0;
    
    for(int i = 0; i < ls.size(); i ++)
    {
        for(int j = pos; j < rs.size(); j ++)
        {
            if(ls[i].y - rs[j].y > d) pos = j + 1;
            
            if(fabs(ls[i].y - rs[j].y) < d) 
            {
                
                double t = dis(ls[i], rs[j]);
                if(d > t) d = t;
            }
            
            if(fabs(ls[i].y - rs[i].y) > d) break;
        }
        
   }
    return d;
}
int main()
{
    int n;
    while(cin >> n && n)
    {
        for(int i = 0; i < n ; i ++)
        {
            double a, b; scanf("%lf %lf", &a, &b);
            
            point[i] = {a, b};
        }
        
        sort(point, point + n, cmpx);
        
        double ans = get_distance(0, n - 1);
        
        printf("%.2lf\n", (ans) / 2);
    }
    return 0;
}
发布了53 篇原创文章 · 获赞 14 · 访问量 1891

猜你喜欢

转载自blog.csdn.net/weixin_45630535/article/details/104825247