Quoit Design(hdu 1007)
题意:给n个点的坐标,求距离最近的一对点之间距离的一半。第一行是一个数n表示有n个点,接下来n行是n个点的x坐标和y坐标。实数。
/*
最小点距离问题
采用分治算法,假设对于1-n的区间,我们已经求出1~m(m是中点)和m+1~n的结果分别是d1和d2。
那么如果1~n的答案出现在这两个单独的区间内,很明显就是min(d1,d2),否则在两个区间之间产生。
如果直接两重循环枚举两个区间的数会T,所以考虑优化:
①:如果某个点到m的距离大于min(d1,d2),那么不考虑。
②:首先用到一个结论:
假设有一个点q,坐标是xq, yq。可以证明在以q为底边中点,长为2d,宽为d的矩形区域内不会有超过6个点
(证明见算法导论,然而我并没看懂,Orz)
有了这个结论之后,我们将第一次优化后的点按照y排序,对于一个点i,如果某个点j与i的y坐标之差大于之前求出的ans,那么j之后的就不用计算了。
(不是很明白复杂度的证明)
*/
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#define N 1000010
using namespace std;
int n;
struct node{
double x,y;
};node qx[N],qy[N];
bool cmpx(const node&s1,const node&s2){
return s1.x<s2.x;
}
bool cmpy(const node&s1,const node&s2){
return s1.y<s2.y;
}
double getdis(node i,node j){
return sqrt((i.x-j.x)*(i.x-j.x)+(i.y-j.y)*(i.y-j.y));
}
double solve(int s,int e){
if(s+==e) return getdis(qx[s],qx[e]);
if(s+==e) return min(min(getdis(qx[s],qx[s+]),getdis(qx[s+],qx[e])),getdis(qx[s],qx[e]));
int mid=s+e>>,cnt=;
double ans=min(solve(s,mid),solve(mid+,e));
for(int i=s;i<=e;i++)
if(fabs(qx[i].x-qx[mid].x)<=ans)
qy[++cnt]=qx[i];
sort(qy+,qy+cnt+,cmpy);
for(int i=;i<=cnt;i++){
for(int j=i+;j<=cnt;j++){
if(qy[j].y-qy[i].y>=ans) break;
ans=min(ans,getdis(qy[i],qy[j]));
}
}
return ans;
}
void work(){
for(int i=;i<=n;i++)
scanf("%lf%lf",&qx[i].x,&qx[i].y);
sort(qx+,qx+n+,cmpx);
printf("%.2lf\n",solve(,n)/);
}
int main(){
while(){
scanf("%d",&n);
if(!n) break;
work();
}
return ;
}
Quoit Design(hdu 1007)的更多相关文章
- 平面最近点对(HDU 1007)
题解:点击 #include <stdio.h> #include <string.h> #include <algorithm> #include <ios ...
- 15个优秀的 Material Design(材料设计)案例
Material Design (材料设计)是由谷歌创建和设计的一种设计语言,结合成功的设计的经典原则以及创新科技.谷歌的目标是开发一个设计系统,让所有的产品在任何平台上拥有统一的用户体验.全新的设计 ...
- 2道acm编程题(2014):1.编写一个浏览器输入输出(hdu acm1088);2.encoding(hdu1020)
//1088(参考博客:http://blog.csdn.net/libin56842/article/details/8950688)//1.编写一个浏览器输入输出(hdu acm1088)://思 ...
- HDU 1007 Quoit Design(二分+浮点数精度控制)
Quoit Design Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- HDU 1007 Quoit Design(经典最近点对问题)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1007 Quoit Design Time Limit: 10000/5000 MS (Java/Oth ...
- HDU 1007:Quoit Design(分治求最近点对)
http://acm.hdu.edu.cn/showproblem.php?pid=1007 题意:平面上有n个点,问最近的两个点之间的距离的一半是多少. 思路:用分治做.把整体分为左右两个部分,那么 ...
- poj 1007 Quoit Design(分治)
Quoit Design Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- Quoit Design(最近点对+分治)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1007 Quoit Design Time Limit: 10000/5000 MS (Java/Oth ...
- Quoit Design(hdu1007)
---恢复内容开始--- Quoit Design Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
随机推荐
- slimScroll的应用(一)
本类文章依旧是针对初学者来说的,希望大家看到后觉得有用的能给个赞~~ 什么是slimScroll? 一.官网介绍: slimScroll is a small (4.6KB) jQuery plugi ...
- 伟景行 citymaker 从入门到精通(1)——js开发,最基本demo,加载cep工程文件
开发环境:citymaker 7(以下简称cm),jquery,easyui 1.4(界面),visual studio 2012(没有vs,不部署到IIS也行,html文件在本地目录双击打开可用) ...
- Handler引起的内存泄露
一般我都写handler的时候是这样的: public class MyActivity extends Activity{ private final Handler myHandler = n ...
- 关于php的问题
$polling_items = db_fetch_assoc("SELECT * FROM poller_item WHERE rrd_next_step<=0 ORDER by h ...
- Runtime理解
动态语言 OC是一门不折不扣的动态语言,所以它的很多机制都是动态运行时决定的.这点和C语言不一样,C语言是静态绑定,也就是编译后所有的一切都已经决定了.这一点和C语言的函数指针有些类似,很多时候函数指 ...
- WEB前端研发工程师编程能力成长之路(2)(转)
WEB前端研发工程师编程能力成长之路(2) 四.[入微] 最强解决方案.你能够走在需求的前面,将当前需求里有的.没有直接提出来的.现在暂时没有但将来可能有的等等,及前端编程潜规则等各个方方面面都综 ...
- eject - 弹出可移动介质
SYNOPSIS(总览) eject -h.breject [-vnrsfq] [<name>] eject [-vn] -d.breject [-vn] -a on|off|1|0 [& ...
- 【软件构造】第三章第三节 抽象数据型(ADT)
第三章第三节 抽象数据型(ADT) 3-1节研究了“数据类型”及其特性 ; 3-2节研究了方法和操作的“规约”及其特性:在本节中,我们将数据和操作复合起来,构成ADT,学习ADT的核心特征,以及如何设 ...
- gcc编译问题
gcc avl.o hash.o list.o rb.o example.o -o 123.exe 多个.o输出 exe -c和-o都是gcc编译器的可选参数.-c表示只编译(compile)源文件但 ...
- 微信小程序之裁剪图片成圆形
前言 最近在开发小程序,产品经理提了一个需求,要求微信小程序换头像,用户剪裁图片必须是圆形,也在github上看了一些例子,一般剪裁图片用的都是方形,所以自己打算写一个小组件,可以把图片剪裁成圆形,主 ...