当前位置: 首页 > news >正文

杭电1007-----C语言实现

这道题花了好久的时间才做出来,刚开始没有思路,最后看了网上的解答,好难得样子,每次都没有看完,但是掌握了大概思想,今天试着做了一下,已ac

主要思想:先将点对按照x排序,再在x排好序的基础上按照y来排序,这个用qsort函数就可直接完成,然后主要就是分治法的运用,将点分成小份来寻找最近点对。每次有三种情况,即你分成的两堆点,最近点对的两点都在1.左边那堆  2.右边那堆  3.左边右边各一个,1, 2两种情况很好想,主要是第三种情况,关于第三种情况,网上有很多分析有详细说明最少只需要比较6个点即可,我的代码为了方便,我比较了7个点。

下面是我的代码:

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define ref 1e20;
#define min(a,b) a>b?b:a;

typedef struct point {
    double x, y;
}Point;

Point p[100000];

int cmpx_y(const void *a, const void *b) {
    double x1, y1, x2, y2;
    x1 = (*(Point *)a).x;
    y1 = (*(Point *)a).y;
    x2 = (*(Point *)b).x;
    y2 = (*(Point *)b).y;
    if (x1 != x2)
        return x1 > x2 ? -1 : 1;
    return y1 > y2 ? -1 : 1;
}

double length_(Point p1, Point p2) {
    return sqrt((p1.x - p2.x)*(p1.x - p2.x) + (p1.y - p2.y)*(p1.y - p2.y));
}

double devide(int low, int high) {
    double min_ = ref;
    if (low == high)
        return ref;
    if (low + 1 == high) {
        return length_(p[low], p[high]);
    }
    int mid = (low + high) / 2;
    double d;
    int i, j;
    if (high - low < 7) {//总共都不足七个点时就直接算出来
        d = ref;
        for (i = low; i < high; i++) {
            for (j = i + 1; j < high; j++) {
                d = min(d, length_(p[i], p[j]));
            }
        }
        return d;

    }
    double d1 = devide(low, mid);
    double d2 = devide(mid + 1, high);
    min_ = min(d1, d2);
    for (i = mid - 3; i <= mid + 3; i++) {
        for (j = i + 1; j <= mid + 3; j++) {
            d = min(min_, length_(p[i], p[j]));
        }
    }
    return d;
}
int main() {
    int n;
    int i, j, k;
    while (scanf("%d", &n) != EOF&&n != 0) {

        for (i = 0; i < n; i++) {
            scanf("%lf%lf", &p[i].x, &p[i].y);
        }
        qsort(p, n, sizeof(p[0]), cmpx_y);
        double d = devide(0, n - 1);
        printf("%.2lf\n", d / 2);

    }
}

 

转载于:https://www.cnblogs.com/lin0/p/6817465.html

相关文章:

  • 解决云服务器ECS,windows server 2012不能安装SQL Server 2012,不能安装.NET Fromework 3.5...
  • 自适应相关知识点1
  • JavaScript 原型链
  • Mysql数据库批量添加数据
  • Spring MVC解决中文乱码(post get)(转)
  • 网站添加用户风险测评
  • yii2邮件配置教程,报Expected response code 250 but got code 553原因
  • ICON 收集
  • hibernate3 和hibernate4的一点小变动
  • 荣获MVP感想
  • 错误简单记录
  • js读取本地txt文件中的json数据
  • HDU 2141 Can you find it?(二分)
  • 201521123083《Java程序设计》第12周学习总结
  • 【DP】:CF #319 (Div. 2) B. Modulo Sum
  • [译]Python中的类属性与实例属性的区别
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • JAVA 学习IO流
  • java取消线程实例
  • Median of Two Sorted Arrays
  • mysql中InnoDB引擎中页的概念
  • node 版本过低
  • node学习系列之简单文件上传
  • Otto开发初探——微服务依赖管理新利器
  • Promise面试题,控制异步流程
  • Redis字符串类型内部编码剖析
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 老板让我十分钟上手nx-admin
  • 码农张的Bug人生 - 初来乍到
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 试着探索高并发下的系统架构面貌
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 用简单代码看卷积组块发展
  • 栈实现走出迷宫(C++)
  • 正则表达式小结
  • 转载:[译] 内容加速黑科技趣谈
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • ​Python 3 新特性:类型注解
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • #Z2294. 打印树的直径
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (1) caustics\
  • (12)Hive调优——count distinct去重优化
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (差分)胡桃爱原石
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (二)pulsar安装在独立的docker中,python测试
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442