zoukankan      html  css  js  c++  java
  • 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
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
  • 相关阅读:
    vscode .vue文件中不能提示html代码
    vscode不能提示已经定义的类名和id?
    vue常用指令
    移动端性能陷阱和硬件加速
    关于样式的获取问题
    “'npm' 不是内部或外部命令,也不是可运行的程序”
    JavaScript之闭包问题
    Sublime Text 套件介紹:Pretty JSON
    教你解决Sublime Text中文乱码问题
    C# 连接Mysql 字符串
  • 原文地址:https://www.cnblogs.com/lightac/p/10625624.html
Copyright © 2011-2022 走看看