hdu_1007_Quoit Design(最近点对)
题意:
给你平面上的一些点,让你找出这些点的最近点对的距离
题解:
采用分治,达到O(nlognlogn)的时间复杂度就能艹过去了
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
//O(nlognlogn)找最近点对
const int N=1e5+;
struct TPoint
{
double x,y;
}ply[N],ans[N];
int n;
inline double MIN(double a,double b) {return a<b?a:b;}
bool cmpx(TPoint a,TPoint b) {return a.x<b.x;}
bool cmpy(TPoint a,TPoint b) {return a.y<b.y;}
double dist(TPoint a,TPoint b)
{
double s1=a.x-b.x;
double t1=a.y-b.y;
return sqrt(s1*s1+t1*t1);
}
double closest(int l,int r)
{
if(l+==r) return dist(ply[l],ply[r]);//2点
else if(l+==r)//三点
return MIN(dist(ply[l],ply[l+]),MIN(dist(ply[l],ply[r]),dist(ply[l+],ply[r])));
int i,j,mid,cnt;
mid=(l+r)>>;
double mi=MIN(closest(l,mid),closest(mid+,r));//递归解决
for(i=l,cnt=;i<=r;i++)//相邻点符合
{
if(fabs(ply[i].x-ply[mid].x)<=mi)
ans[cnt++]=ply[i];
}
sort(ans,ans+cnt,cmpy);//按y排序
for(i=;i<cnt;i++)for(j=i+;j<cnt;j++)//更新最小距离
{
if(ans[j].y-ans[i].y>=mi) break;
mi=MIN(mi,dist(ans[i],ans[j]));
}
return mi;
}
int main()
{
while(scanf("%d",&n),n)
{
int i;
for(i=;i<n;i++) scanf("%lf%lf",&ply[i].x,&ply[i].y);//输入点
sort(ply,ply+n,cmpx);//按x排序
double mi=closest(,n-);
printf("%.2lf\n",mi/);
}
return ;
}
hdu_1007_Quoit Design(最近点对)的更多相关文章
- 杭电OJ——1007 Quoit Design(最近点对问题)
Quoit Design Problem Description Have you ever played quoit in a playground? Quoit is a game in whic ...
- hdu 1007 Quoit Design (最近点对问题)
Quoit Design Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- HDU 1007Quoit Design(最近点问题)
最近点问题:二维平面中有n(n很大)个点,求出距离最近的两个点 思路:因为n的值很大,所以暴力和dp都行不通了吧!分治法就挺好的. 将区间一半一半的分开,直到分成只有一个点或两个点的时候! 对于只有两 ...
- HDU 1007 Quoit Design最近点对( 分治法)
题意: 给出平面上的n个点,问任意点对之间的最短距离是多少? 思路: 先将所有点按照x坐标排序,用二分法将n个点一分为二个部分,递归下去直到剩下两或一个点.对于一个部分,左右部分的答案分别都知道,那么 ...
- ZOJ2107 Quoit Design 最近点对
ZOJ2107 给定10^5个点,求距离最近的点对的距离. O(n^2)的算法是显而易见的. 可以通过分治优化到O(nlogn) 代码很简单 #include<iostream> #inc ...
- HDU题解索引
HDU 1000 A + B Problem I/O HDU 1001 Sum Problem 数学 HDU 1002 A + B Problem II 高精度加法 HDU 1003 Maxsu ...
- 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 (Java/Others)Total ...
- ZOJ 2017 Quoit Design 经典分治!!! 最近点对问题
Quoit Design Time Limit: 5 Seconds Memory Limit: 32768 KB Have you ever played quoit in a playg ...
随机推荐
- git: reset
git reset --hard:把commit撤销,意思是不仅此次commit提交的文件从本地版本库的状态重置,而且把此次commit的文件也从本地目录中删除 所以如果你执行之后发现,git sta ...
- vb6加载时提示出错,窗体log文件中错误信息为:控件 XX 的类 MSComctlLib.ListView 不是一个已加载的控件类。
解决办法:单击[工程] -- [部件] 添加此Microsoft Windows Common Controls-6.0 (SP6)部件,如果列表中没有,浏览到~\project\包\Support中 ...
- 复习之webview(观看张荣超视频)
webview定义的两张方式: 1,是在xml文件里面进行定义: 2,实在代码里面定义: 3,在webview上显示内容必要的配置: 4常见的设置: 是否支持javascript 是否支持缩放 ...
- VI/VIM 常用命令
VI/VIM 常用命令=========== 整理自鸟哥的私房菜 ---------- - 移动光标 命令 | 描述----------------------- ...
- jQuery实现 图片的局部放大效果
<html xmlns="http://www.w3.org/1999/xhtml"><head> <title></title> ...
- gerrit push配置
第一种方法: 在home目录下,编辑.gitconfig文件,添加 [remote "review"] url = ssh://someone@oneip:port/project ...
- GlusterFS常用命令小结
# /etc/init.d/glusterd start # /etc/init.d/glusterd stop # /etc/init.d/glusterd status 2. 开机自动 ...
- csu1010: Water Drinking
/* 本题的题意: 沙漠中有很多骆驼和一个池塘,0表示池塘,1-N表示骆驼,输入的两个数表示两只骆驼,其中前面的那一头靠近池塘,所有的骆驼队列不交叉不相连,求站在队尾但是离水井最近的骆驼编号 经过分析 ...
- lldpd-0.7.7代码解读(send_pdu部分)
此文档是经过逆序推到出的,可能有错误之处,敬请指教,谢谢. 1)interfaces_update 更新一些接口信息 2)levent_iface_subscribe 该接口通过socket通信(非阻 ...
- js纯ajax
var XMLHttpReq; function createXMLHttpRequest() { try { XMLHttpReq = new ActiveXObject("Msxml2. ...