uva 10245 近期点对问题
分治法的典例
当练手了
奇妙的是。使用inplace_merge按说应该是O(n)的算法。可是用sort nlogn的算法反而更快
先上快排版
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath> using namespace std; const int SIZE = 10000+10;
const double INF = 100000; struct Point
{
double x,y;
}p[SIZE],q[SIZE]; int n; inline double dis(const Point a, const Point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
} bool cmpx(const Point &a, const Point &b)
{
return a.x<b.x;
} bool cmpy(const Point &a, const Point &b)
{
return a.y<b.y;
} double MinDis(int l,int r)
{
if(r-l<1)return INF;
if(r-l==1)return dis(p[r],p[l]); int m=(l+r)/2;
double d=min(MinDis(l,m),MinDis(m+1,r));
int left=l,right=r+1;
int i;
for(i=m;i>=l;i--)
if(p[i].x<p[m].x-d)
{
left=i+1;
break;
}
for(i=m;i<=r;i++)
if(p[i].x>p[m].x+d)
{
right=i;
break;
}
for(int i=left;i<right;i++)q[i]=p[i];
sort(q+left,q+right,cmpy);
int j;
double ret=d;
for(int i=left;i<right;i++)
{
for(j=i+1;j<right && q[j].y-q[i].y<d;j++)
{
ret=min(ret,dis(q[i],q[j]));
}
}
return ret; } int main()
{
double ans; while(scanf("%d",&n)&&n)
{
for(int i=0;i<n;i++)
{
scanf("%lf%lf",&p[i].x,&p[i].y);
}
sort(p,p+n,cmpx);
ans=MinDis(0,n-1);
if(ans>10000)printf("INFINITY\n");
else printf("%.4lf\n",ans);
} return 0;
}
再上归并
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath> using namespace std; const int SIZE = 10000+10;
const double INF = 100000;
#define dis(a,b) sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y))
#define Fabs(x) x>0?x:-x
const double eps=1e-9; struct Point
{
double x,y;
}p[SIZE],q[SIZE]; int n; /*inline double dis(const Point a, const Point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}*/ bool cmpx(const Point &a, const Point &b)
{
return a.x<b.x;
} bool cmpy(const Point &a, const Point &b)
{
return a.y<b.y;
} double MinDis(int l,int r)
{
if(r-l<1)return INF;
//if(r-l==1)return dis(p[r],p[l]); int m=(l+r)/2;
double d=min(MinDis(l,m),MinDis(m+1,r));
inplace_merge(p+l,p+m+1,p+r+1,cmpy);
int j,right=0;
for(int i=l;i<=r;i++)//0 <n
if(p[i].x >= p[m].x-d && p[i].x<=p[m].x+d)
q[right++]=p[i];
double ret=INF;
for(int i=0;i<right;i++)
{
for(j=i+1;j<right && q[j].y-q[i].y<d;j++)
{
ret=min(ret,dis(q[i],q[j]));
}
}
return min(d,ret);
} int main()
{
double ans; while(scanf("%d",&n)&&n)
{
for(int i=0;i<n;i++)
{
scanf("%lf%lf",&p[i].x,&p[i].y);
}
sort(p,p+n,cmpx);
ans=MinDis(0,n-1);
if(ans>=10000)printf("INFINITY\n");
else printf("%.4lf\n",ans);
} return 0;
}
uva 10245 近期点对问题的更多相关文章
- UVA 10245 The Closest Pair Problem 最近点问题 分治算法
题意,给出n个点的坐标,找出两点间最近的距离,如果小于10000就输出INFINITY. 纯暴力是会超时的,所以得另辟蹊径,用分治算法. 递归思路将点按坐标排序后,分成两块处理,最近的距离不是在两块中 ...
- UVA 10245 - The Closest Pair Problem
Problem JThe Closest Pair ProblemInput: standard inputOutput: standard outputTime Limit: 8 secondsMe ...
- uva 10245 The Closest Pair Problem_枚举
题意:求任意两点之间的距离的最少一个距离 思路:枚举一下就可以了 #include <iostream> #include<cstdio> #include<cmath& ...
- UVa 10245 The Closest Pair Problem (分治)
题意:给定 n 个点,求最近两个点的距离. 析:直接求肯定要超时的,利用分治法,先把点分成两大类,答案要么在左边,要么在右边,要么一个点在左边一个点在右边,然后在左边或右边的好求,那么对于一个在左边一 ...
- UVA 10245 The Closest Pair Problem【分治】
题目链接: http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=21269 题意: 求平面最近点对. 分析: 经典问题. n比 ...
- <算法竞赛入门经典> 第8章 贪心+递归+分治总结
虽然都是算法基础,不过做了之后还是感觉有长进的,前期基础不打好后面学得很艰难的,现在才慢慢明白这个道理. 闲话少说,上VOJ上的专题训练吧:http://acm.hust.edu.cn/vjudge/ ...
- UVA - 11354Bond最小生成树,LCA寻找近期公共祖先
看懂题目意思.他的意思是求将全部的城市走一遍,危急度最小.而且给 你两个s,t后让你求在走的时候,从s到t过程中危急度最大的值,并输出它, 然后就是怎样攻克了,这个题目能够说简单,也能够说难 通过思考 ...
- UVA 10603 Fill(正确代码尽管非常搓,网上很多代码都不能AC)
题目链接:option=com_onlinejudge&Itemid=8&page=show_problem&problem=1544">click here~ ...
- UVA 11423 - Cache Simulator (树状数组)
UVA 11423 - Cache Simulator (树状数组) option=com_onlinejudge&Itemid=8&category=523&page=sho ...
随机推荐
- ORACLE—005:创建JOB(二)
假设须要创建带參数的job,怎样创建呢. 我们直接将參数声明.并赋值.然后传给job调用的存储过程就可以. 比如.存储过程名为Pro_Test_JOB,參数共同拥有一个.是VARCHAR2类型. 创建 ...
- 彻底删除"提示删除文件和目录"时出错的文件或目录
当删除文件是出现上图时 能够用以下的方法删除文件 策略一:系统大法 第一招 进程帮你搞定 很多时候乱码文件名称里的文件是explorer.exe进程联系在一起的. 假设要删除的话能够这样:首先命令 ...
- AFNetworking2.0后 进行Post请求
本文以新浪微博的Oauth认证为样例进行Post请求的演示 以下直接上代码: #import "ViewController.h" #import "AFNetworki ...
- cocos2d-x 类大全及其概要
CCNode 节点类是Cocos2D-x中的主要类,继承自CCObject. 任何需要画在屏幕上的对象都是节点类.最常用的节点类包括场景类(CCScene).布景层类(CCLayer).人物精灵类(C ...
- 【Java&Android开源库代码剖析】のAndroid-Universal-Image-Loader-part1
做Android app开发的同学应该都听说过或者用过nostra13的Android-Universal-Image-Loader开源库,它在图片异步加载.缓存和显示等方面提供了强大灵活的框架.之前 ...
- nyoj 130 同样的雪花 【哈希】
同样的雪花 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描写叙述 You may have heard that no two snowflakes are alike. ...
- Session为空的一种原因
在维护一份比较老的代码,想改为ajax调用,然后就添加了一个一般处理程序文件,也就是以.ashx结尾的文件,一切都正常,但发现session一直为空,很奇怪 基本的代码如下: public class ...
- Linux Server
Linux Server CentOS 6.3下配置iSCSI网络存储 摘要: 一.简介iSCSI(internet SCSI)技术由IBM公司研究开发,是一个供硬件设备使用的.可以在IP协议的上层运 ...
- ps、top 、free查看用户资源信息
查看root用户的进程信息. 运行命令: ps -u root 查看oracle用户的进程信息. 运行命令: ps -u oracle 若查看现在的资源占用情况,如何呢? 运行命令: top 可以 ...
- wp天气预报
ak url http://developer.baidu.com/map/index.php?title=car 后台cs using System; using System.Collectio ...