• HDU1007


    分治问题(十分重要)

    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #include <cstdio>
    #include <cmath>
    
    using namespace std;
    struct point
    {
        double x,y;
    }p[100005];
    int a[100005];          // 用于记录位置号
    int cmpx(const point &a,const point &b)
    {
        return a.x < b.x;
    }
    
    int cmpy(const int &a,const int &b)
    {
        return p[a].y < p[b].y;
    }
    
    double dis(int a,int b) {
        return sqrt((p[a].x - p[b].x) * (p[a].x - p[b].x) + (p[a].y - p[b].y) * (p[a].y - p[b].y));
    }
    
    double cloest (int left, int right)     // 求最小距离的子函数
    {
        if (left == right)
            return 1000000;
        if (left + 1 == right)
            return dis(left,right);
        int mid = (left + right) >> 1;  // 相当于除二
        double d1 = cloest(left, mid);     //递归求左部分最近点距离
        double d2 = cloest(mid + 1, right);   //右部分
        double d = min(d1, d2);
        int i, j, k = 0;
        for (i = left ; i <= right; i++ ) {
            if (fabs(p[mid].x - p[i].x) < d)     //记录和mid位置点小于d的点的位置
                a[k++] = i;        //注意这里记录的是位置号
        }
        sort(a, a + k, cmpy);    //按y坐标排序
        for (i = 0; i < k - 1; i++) {
            for (j = i + 1; j < i + 7 && j < k; j++) {
                if (p[a[j]].y - p[a[i]].y >= d)
                    break;
                d = min(d, dis(a[i], a[j]));
            }
        }
        return d;
    }
    
    
    int main()
    {
        int i, n;
        while (scanf("%d", &n) != 0) {
            if(!n)
                break;
            for( i = 0; i < n; i++ ) {
                scanf("%lf %lf", &p[i].x, &p[i].y);
            }
            sort (p, p + n, cmpx);    //按x坐标排序
            printf("%.2f
    ", cloest(0, n - 1) / 2);
        }
        return 0;
    }
    
    作者:LightAc
    出处:https://www.cnblogs.com/lightac/
    联系:
    Email: dzz@stu.ouc.edu.cn
    QQ: 1171613053
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
  • 相关阅读:
    Android API之android.provider.ContactsContract.Data
    Android API之android.provider.ContactsContract
    Android API之android.provider.ContactsContract.Contacts
    Android API之android.os.Parcelable
    Android网络开发之基本介绍
    wpf小技巧——datagrid 滚动条问题
    C# List去重的三种方法(转)
    spring jwt springboot RESTful API认证方式
    Springboot 实现api校验和登录验证
    SpringBoot系列
  • 原文地址:https://www.cnblogs.com/lightac/p/10625624.html
Copyright © 2020-2023  润新知