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

C++编程题目------平面上的最接近点对(分治算法)

题目描述

给定平面上n个点,找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的。

输入格式

第一行一个整数 n,表示点的个数。

接下来 n 行,每行两个实数 x,y ,表示一个点的行坐标和列坐标。

输出格式

仅一行,一个实数,表示最短距离,四舍五入保留 4 位小数。

样例

样例输入 #1

3
1 1
1 2
2 2

样例输出 #1

1.0000
数据范围与提示

对于 100% 的数据,保证0<n<=10000 ,0<=x,y<=1000000000,小数点后的数字个数不超过6 。

代码:

#include<bits/stdc++.h>
using namespace std;
int n;
struct point{
	double x,y;
};
point a[10010],tmp[10010];
double ans;
bool cmpx(const point &A,const point &B){
	if(A.x==B.x)
		return A.y<B.y;
	else
		return A.x<B.x;
}
bool cmpy(const point &A,const point &B){
	if(A.y==B.y)
		return A.x<B.x;
	else
		return A.y<B.y;
}
double dist(point A,point B){
	return sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y));
}
double f(int L,int R){
	double ans=2<<18;
	if(L==R)
		return ans;
	else if(L+1==R){
		return dist(a[L],a[R]);
	}
	else{
		int mid=(L+R)>>1;
		double ans1=f(L,mid);
		double ans2=f(mid+1,R);
//		cout<<ans1<<" "<<ans2<<endl; 
		ans=min(ans1,ans2);
//		ans=ans1;
//		if(ans>ans2)
//			ans=ans2;
		int cnt=0;
		for(int i=L;i<=R;i++)
			if (fabs(a[i].x-a[mid].x)<=ans)
				tmp[++cnt]=a[i];
		sort(tmp+1,tmp+cnt+1,cmpy);
		for(int i=1;i<cnt;i++)
			for(int j=i+1;j<=cnt;j++)
				if(tmp[j].y-tmp[i].y<=ans)
					ans=min(ans,dist(tmp[i],tmp[j]));
		return ans;
	}
}
int main() {
    cin>>n;
    for(int i=1;i<=n;i++)
    	cin>>a[i].x>>a[i].y;
    sort(a+1,a+n+1,cmpx);
	//for(int i=1;i<=n;i++)
	//cout<<a[i].x<<" "<<a[i].y<<endl;
	ans=f(1,n);
	cout<<fixed<<setprecision(4)<<ans<<endl;
	//print("%.4lf\n",ans);
    return 0;
}


http://www.kler.cn/news/108786.html

相关文章:

  • C++设计模式_13_Flyweight享元模式
  • 漏洞复现-showdoc文件上传_v2.8.3_(CNVD-2020-26585)
  • Python环境下LaTeX数学公式转图像方案调研与探讨
  • 【大数据Hive】hive 表数据优化使用详解
  • 西工大CSAPP第二章课后题2.55答案及解析
  • 什么是程序化交易
  • 计算机网络--第一次作业
  • C51--PWN-舵机控制
  • 直线模组怎么分类?
  • 在JS中,var 、let 、const 总结
  • ENSP L2TP 配置
  • springboot 配置文件加载顺序
  • 微信小程序vue+uniapp旅游景点门票预订系统 名胜风景推荐系统
  • End-to-End Adversarial-Attention Network for Multi-Modal Clustering
  • leetCode 260.只出现一次的数字 ||| + 位运算
  • 这个故事有点长 - 舟山
  • 洛谷 B2135:单词替换
  • 2022年上半年上午易错题(软件设计师考试)
  • 信息检索与数据挖掘 | 【实验】排名检索模型
  • Cesium弹窗可随地图移动
  • 神经网络与深度学习第四章前馈神经网络习题解答
  • 搞定蓝牙-第六篇(HID
  • FL Studio21.2演示版下载
  • [Leetcode] 0108. 将有序数组转换为二叉搜索树
  • unity3d场景加载
  • Sprint Cloud Stream整合RocketMq和websocket实现消息发布订阅
  • 设置Ubuntu 20.04的静态IP地址(wifi模式下)
  • 全能数字音乐工作站(DAW)编曲FL Studio21.2.0官方中文版
  • python之拟合圆心及半径
  • Opencv-图像插值与LUT查找表