杭电 1007(最近点对问题,最详细的思路解析过程)
时间:2022-07-24
本文章向大家介绍杭电 1007(最近点对问题,最详细的思路解析过程),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题意:给一系列坐标,然后让你求最近点对的1/2的距离!!!
思路:我一开始没怎么想,就暴力着把所有的点都遍历一遍,然后每次两个坐标得到一个距离,然后每次min得到最小的距离,所有的点遍历后就能得到最小距离。(超时!!!) 下面是错误代码,只考虑了相邻的两个点间的距离,我们必须要用两个for循环把所有的两两点遍历得到最小距离
#include<bits/stdc++.h>
#define maxn 100005
#define inf 0x3f3f3f3f
using namespace std;
int N;
struct node{
double x;
double y;
}a[maxn];
int main(){
while(cin>>N && N){
double minn = inf;
cin>>a[1].x>>a[1].y;
for(int i=2;i<=N;i++){
cin>>a[i].x>>a[i].y;
double r;
r = sqrt((a[i].x-a[i-1].x)*(a[i].x-a[i-1].x)+(a[i].y-a[i-1].y)*(a[i].y-a[i-1].y));
minn = min(minn,1.0/2.0 * r);
}
cout<<fixed<< setprecision(2)<<minn<<endl;
}
return 0;
}
然后我又想这个题不就是得到最小的两个坐标嘛,我就先把所有的坐标存入结构体坐标,然后的话我一个sort排序得到最近的两个坐标,我哭o(╥﹏╥)o了,菜是原罪。如果是负数的话,这个排序是错误的啊,负数的绝对值大的最后面,这个有可能就错失了真实的最短距离!!!垃圾!!我靠!!
#include<bits/stdc++.h>
#define maxn 100005
//#define inf 0x3f3f3f3f
using namespace std;
int N;
struct node{
double x;
double y;
}a[maxn];
int cmpp(node a,node b){
if(a.x = b.x) return a.y < b.y;
return a.x < a.y;
}
int main(){
while(cin>>N && N){
for(int i=0;i<N;i++){
cin>>a[i].x>>a[i].y;
}
sort(a,a+N,cmpp);
double ans = 1.0/2.0 *sqrt((a[1].x-a[0].x)*(a[1].x-a[0].x)+(a[1].y-a[0].y)*(a[1].y-a[0].y));
cout<<fixed<< setprecision(2)<<ans<<endl;
}
return 0;
}
暴力超时怎么办???!!!分治法来帮忙!!!
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 100005
struct node
{
double x,y;
} point[N];
int point1[N];//存储符合标准的点的坐标
bool cmpx(node a,node b)//按x坐标从小到大排序
{
return a.x<b.x;
}
bool cmpy(int a,int b)//按y坐标从小到大进行排序
{
return point[a].y<point[b].y;
}
double dist(node a,node b)//求出两点间的距离
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double near(int l,int r)//利用分治法找出最近的两个点的距离
{
if(l>=r)
return 1e10;
int mid=(l+r)/2;
int n=0;
double distan=min(near(l,mid),near(mid+1,r));//利用二分法分为两个区间
for(int i=mid; i>=l; --i)//把前一半符合条件的点的位置存入数组q中
{
if(point[mid].x-point[i].x<distan)
{
point1[n++]=i;
}
else break;
}
for(int i=mid+1; i<=r; ++i)//把后一半符合条件的点的位置存入数组q中
{
if(point[i].x-point[mid].x<distan)
{
point1[n++]=i;
}
else break;
}
sort(point1,point1+n,cmpy);//对这些点按纵坐标进行升序排序
for(int i=0; i<n; i++)
{
for(int j=i+1; j<n; j++)
{
if(point[point1[j]].y-point[point1[i]].y<distan)//找出这些点中距离的最小值
{
distan=min(dist(point[point1[i]],point[point1[j]]),distan);
}
else break;
}
}
return distan;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
if(n==0)
break;
for(int i=0; i<n; i++)
{
scanf("%lf %lf",&point[i].x,&point[i].y);
}
sort(point,point+n,cmpx);
printf("%.2lfn",near(0,n-1)/2);
}
return 0;
}
- Enumerable#Zip 实现一下
- 更新自己,不要影响其他人
- 【译】Spring官方教程:Spring Boot整合消息中间件RabbitMQ
- [实录]解决Migrator.Net 小bug
- Jenkins Pipeline插件十大最佳实践!
- Spring Cloud Hystrix的请求合并
- JQuery JCshare 0.1 分享插件
- Java中的即时编译(Just-in-time compilation)
- 无尽的忙碌换来幸福的日子
- 消费者驱动的微服务契约测试套件:Spring Cloud Contract
- 自己做的一个小程序 可采集、导出、模板、配置
- 分布式消息队列 RocketMQ 源码分析 —— Message 拉取与消费(上)
- .NET反射、委托技术与设计模式
- 我最常用的Intellij IDEA快捷键
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- python-剑指offer41-62
- 【python-opencv】读取、显示、写入图像
- WSL——windows上的linux子系统
- 【python-opencv】读取、显示、保存视频
- 超级账本——Hyperledger Fabric
- 【python-opencv】绘图(目标检测框及其置信度等)
- 哈希表:哈希值太大了,还是得用set
- 哈希表:今天你快乐了么?
- 简单二分法查找(binary search)
- 【python-opencv】鼠标作为画笔
- npm 依赖管理中被忽略的那些细节
- 哈希表:map等候多时了
- 简单了解异步通信
- 哈希表:其实需要哈希的地方都能找到map的身影
- 哈希表:这道题目我做过?