算法题目——最短路径问题(HDU—1007)

题目链接:HDU-1007

前序: 先看一维中的最短路径的计算方式

问题的简单描述:(题意)
在一个笛卡尔系中,n个点分布不一,在这N个点中,求出相距最短的两个点之间的距离

思路:
分治二分法
解题报告:
就是要把N个点x坐标和Y坐标进行排序,然后进行比较!
代码过程:
使用递归分治法解决问题
递归的退出条件:仅当剩余两个顶点时,直接计算出距离。仅剩三个点时,求出任意两点之间的距离,进行比较
进行分治递归:二分法,先将结构体数组分成两份(根据中间点来分)然后递归求d=min(左边s1,右边s2)
点对分别在集合S1和S2中。利用递归分析法分别计算前两种情况,第三种方法另外分析。求解出三类子情况后,
再合并三类情况,比较分析后输出三者中最小的距离。

参考代码:

#include <cstdio>
#include <algorithm>
#include<vector>
#include <cmath>using namespace std;int n;
struct node{double x,y;
}a[100001];int b[100001];double Min(double a,double b)
{return a<b?a:b;
} bool cmpx(node a,node b)
{return a.x<b.x;
}bool cmpy(int A,int B)
{return a[A].y<a[B].y;
}double Distance(node a,node b)
{return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}//参数:s 是结构体数组的开始(0),e是结构体数组的长度(n-1) 
double closestPoint(int s,int e)//求得是直径 
{if(e-s==1)//仅有两个点时 return Distance(a[s],a[e]);//求得是直径 if(e-s==2)//仅三个点时 return Min(Distance(a[s],a[s+1]),Min(Distance(a[s+1],a[e]),Distance(a[s],a[e])));int mid=(s+e)/2;int index=0;double d=Min(closestPoint(s,mid),closestPoint(mid+1,e));//分成前面一段,后面一段 得到最小直径 for(int i=s;i<=e;i++){if(a[i].x>=a[mid].x-d&&a[i].x<=a[mid].x+d)//即当有一个点到中间结点的距离小于两段最短距离d时//至少是直角边小于d,才有可能斜边有机会出现小于d b[index++]=i;//记录的下标 }sort(b,b+index,cmpy);//将记录的下标数据按照Y轴进行排序 //有个原理说明了这个下标序列最多有六个点 for(int i=0;i<index;i++){for(int j=i+1;j<index&&j<=i+7;j++)//因为最多有6个点,又因为结构体的起点是从1开始的 {if(a[b[j]].y-a[b[i]].y>=d)//如果y轴,该结点到中间结点的距离大于d时 break;d=Min(d,Distance(a[b[i]],a[b[j]]));//如果y轴,该结点到中间结点的距离小于d时 }}return d;
}int main()
{vector<double> vec;while(scanf("%d",&n)!=EOF&&n!=0){for(int i=0;i<n;i++)scanf("%lf%lf",&a[i].x,&a[i].y);sort(a,a+n,cmpx);vec.push_back(closestPoint(0,n-1)/2.0);}for(int i=0;i<vec.size();i++){printf("%.2lf\n",vec[i]);}return 0;
} 

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306439.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

没有Kubernets,学习Docker还有用吗?

Docker容器化和Kubernetes容器编排&#xff0c;作为微服务和云原生的核心依赖&#xff0c;这几年已是大红大紫全民皆知。然而近日Kubernetes官方发布公告&#xff0c;宣布自 v1.20 起放弃对 Docker 的支持&#xff0c;惊呆了一众开发者。在这背后&#xff0c;究竟是人性的扭曲&…

算法题目——二次函数三分求极值(HDU-3714)

题目链接&#xff1a;HDU-3714 题目描述&#xff1a; 对于N个二次函数&#xff0c;求每个二次函数的最小值中的最大值 思路&#xff1a; 使用三分法求极值&#xff08;递归调用&#xff09; 对于这种在指定区间里只有一个极值点的函数&#xff08;凸函数凹函数都可以&#xff…

怎样才能去掉图片锁定纵横比_1分钟批量统一Word中300张图片的大小!无需插件、代码,超级简单...

很多时候我们需要将在Word中插入很多张图片&#xff0c;插入完成之后&#xff0c;一般我们还要统一它们的大小&#xff0c;如果是少量的图片的话&#xff0c;我们可以一个一个选择&#xff0c;然后再进行设置。或者先设置好一张图片后&#xff0c;再通过【F4】键&#xff0c;进…

我国火力发电站的大脑用上了国产系统

近年来&#xff0c;我国核电、水电、风电、光伏产业发展迅速&#xff0c;但从发电总量来看&#xff0c;火电依然占据7成以上的发电比例。水电、风电、光伏等清洁能源受自然条件限制&#xff0c;只能成为火电的有效补充&#xff0c;而不可能取代火电。而福岛核事故、切尔诺贝利核…

require 动态加载_require,exports,module.exports和import,export,export default

我们前端在开发过程中经常会遇到导入导出功能&#xff0c;在导入时&#xff0c;有时候是require&#xff0c;有时候是import在导出时&#xff0c;有时候是exports&#xff0c;module.exports&#xff0c;有时候是export&#xff0c;export default今天我们对这些内容进行简单的…

dotnet core 应用是如何跑起来的 通过AppHost理解运行过程

在 dotnet 的输出路径里面&#xff0c;可以看到有一个有趣的可执行文件&#xff0c;这个可执行文件是如何在框架发布和独立发布的时候&#xff0c;找到 dotnet 程序的运行时的&#xff0c;这个可执行文件里面包含了哪些内容在回答上面的问题之前&#xff0c;请大家尝试打开 C:\…

算法题目——整数划分(HRBUST-2004)

题目链接&#xff1a;HRBUST-2004 递归法: 1.当n1时&#xff0c;此时只有1种解{1}; 2.当m1时&#xff0c;此时也只有1种解{1,1,1, … 3.当n> m时&#xff0c;要分为最大数包含m和不包含m两种情况。 ●包含m:此时就是{mx1,2…}. 其中x1x23.… n-m, 就相当于求和为n-m,最…

dotnet core 应用是如何跑起来的 通过自己写一个 dotnet host 理解运行过程

在上一篇博客是使用官方提供的 AppHost 跑起来整个 dotnet 程序。本文告诉大家在 dotnet 程序运行到托管代码之前&#xff0c;所需要的 Native 部分的逻辑。包括如何寻找 dotnet 运行时&#xff0c;如何加载运行时和框架然后跑起来业务端的 dll 文件的逻辑在上一篇博客告诉大家…

算法题目——多米诺骨牌问题(POJ-2663)

题目链接&#xff1a;POJ-2663 设有形状一样的多米诺牌&#xff0c;每张牌恰好覆盖棋盘上相邻的两个方格&#xff0c;即一张多米诺牌是一张 1 行 2 列或者 2 行 1 列的牌。那么&#xff0c;是否能够把 32 张多米诺牌摆放到棋盘上&#xff0c;使得任何两张多米诺牌均不重叠&…

算法题目——求众数

在c中有两个关联容器&#xff0c; 第一种是map&#xff0c;内部是按照key排序的&#xff0c;从小到大 第二种是unordered_map&#xff0c;容器内部是无序的&#xff0c;使用hash组织内容的。 #include<iostream> #include<map> #include<algorithm> using n…

2020武汉dotNET俱乐部分享交流会圆满结束

经过长达2个多月的准备&#xff0c;终于在12月5日圆满的举行了武汉首次dotNET俱乐部线下分享交流活动。我们一共精心准备了3个目前比较热门的主题&#xff0c;分别如下&#xff1a;Jason分享的《ABP开发框架的扩展应用》Leo分享的《基于Kubernetes的DevOps平台应用》Eleven分享…

算法——常用的数据结构/模板/基础知识

常用的数据结构/模板/基础知识(一)c——优先队列(priority_queue)最大堆和最小堆的写法(二)c中的全排列函数next_permutation()(三)迭代器的使用(四)数学知识数列求和(五)求最大公约数和最小公倍数(六)将数值型数据转化为string 类型(一)c——优先队列(priority_queue) 最大堆…

对 精致码农大佬 说的 Task.Run 会存在 内存泄漏 的思考

一&#xff1a;背景 1. 讲故事这段时间项目延期&#xff0c;加班比较厉害&#xff0c;博客就稍微停了停&#xff0c;不过还是得持续的技术输出呀&#xff01;园子里最近挺热闹的&#xff0c;精致码农大佬分享了三篇文章&#xff1a;为什么要小心使用 Task.Run [https://www.c…

算法题目——爬楼梯(动态规划)

题目链接:70.爬楼梯 类似题目:1646.获取生成数组中最大值 本题大家如果没有接触过的话,会感觉比较难,多举几个例子,就可以发现其规律。 爬到第一层楼梯有一种方法,爬到二层楼梯有两种方法。 那么第一层楼梯再跨两步就到第三层 ,第二层楼梯再跨一步就到第三层。 所以到…

Kubernetes 1.20 发布:妙啊

喜欢就关注我们吧&#xff01;Kubernetes 1.20 发布&#xff0c;这是 2020 年的第三版也是最终版。Kubernetes 1.20 还是最近这段时间以来&#xff0c;功能最密集的版本之一&#xff0c;此版本包含了 42 个增强功能&#xff0c;其中 11 个增强功能已逐步升级为稳定版&#xff0…

算法题目——生成括号匹配

题目链接:剑指offer.85 生成 n 对括号共需要 2n 步,每一步都面临两个选项,即生成左括号或者右括号,题目要求返回所有的情况,所以本问题很适合采用回溯法。 在生成左右括号时存在两个限制条件,一个是左括号或者右括号的数量都不能超过 n 个,第二个是已经生成的右括号数…

C# WPF开源控件库:MahApps.Metro

❝其实站长很久之前就知道这个开源WPF控件库了&#xff0c;只是一直欣赏不了这种风格&#xff0c;但也star了该项目。每次浏览该仓库时&#xff0c;发现star越来越多&#xff0c;也看到很多网友对它的褒奖&#xff0c;所以今天就向大家推荐这款WPF控件库。1. 具体有多优秀&…

golang 切片 接口_Golang语言常用关键字之 make 和 new

上一章中对于golang的语言基础说明如下&#xff1a;1 函数调用2 接口3 反射接下来我们来对golang的常用关键字进行说明&#xff0c;主要内容有&#xff1a;1. for 和 range2. select3. defer4. panic 和 recover5. make 和 new— — — — — — — — — — — — — — — —…

读书 | 数字化转型的道与术(上)

【数字化转型】| 作者 / Edison Zhou这是EdisonTalk的第312篇学习总结 最近在阅读钟华老师的新作《数字化转型的道与术》&#xff0c;记录和总结了一些学习笔记和感想&#xff0c;整理成文分享与你&#xff0c;本文为上半部分&#xff0c;希望能对也在参与数字化转型的各位童鞋…

算法题目——最长连续序列

题目链接:leetcode.128 思路: 1.现将数据存放到数组中去 2.再将数据存到一个集合set中去(方便去重,查找某一个元素是否存在于数组中) 3.循环该数组,若该元素的前一个元素不在数组中(通过集合来查找),说明它将会是一个连续序列的开始元素,在对该元素循环查看它的下一个元素…