Hdoj 1007 Quoit Design 题解
Problem Description
Have you ever played quoit in a playground? Quoit is a game in which flat rings are pitched at some toys, with all the toys encircled awarded.
In the field of Cyberground, the position of each toy is fixed, and the ring is carefully designed so it can only encircle one toy at a time. On the other hand, to make the game look more attractive, the ring is designed to have the largest radius. Given a configuration of the field, you are supposed to find the radius of such a ring.
Assume that all the toys are points on a plane. A point is encircled by the ring if the distance between the point and the center of the ring is strictly less than the radius of the ring. If two toys are placed at the same point, the radius of the ring is considered to be 0.
Input
The input consists of several test cases. For each case, the first line contains an integer N (2 <= N <= 100,000), the total number of toys in the field. Then N lines follow, each contains a pair of (x, y) which are the coordinates of a toy. The input is terminated by N = 0.
Output
For each test case, print in one line the radius of the ring required by the Cyberground manager, accurate up to 2 decimal places.
Sample Input
2
0 0
1 1
2
1 1
1 1
3
-1.5 0
0 0
0 1.5
0
Sample Output
0.71
0.00
0.75
Author
CHEN, Yue
Source
思路
最小点对算法:
- 只有2个点:就返回这2个点的距离
- 只有3个点:就返回两两组成中最短的距离
- 大于3个点:采用分治,步骤如下:
- 根据横坐标x对所有的店进行升序排列
- 找出中心线L,将点集划分为左右2部分\(SL,SR\)
- 递归分治解决找出\(d = min(dL,dR)\),表示\(SL,SR\)中的最近点对
- 将处于\([L-d,L+d]\)中的点按照y值升序排列,不断更新最近点对的距离(如果最近点对的情况是一个在\(SL\),一个在\(SR\)里面,肯定不会超过这个边界)
代码
#include<bits/stdc++.h>
using namespace std;
struct node
{
double x;
double y;
}a[100010],b[100010];
bool cmpx(node a, node b)
{
return a.x < b.x;
}
bool cmpy(node a, node b)
{
return a.y < b.y;
}
double dis(node a, node b)
{
return (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y);
}
double binaryCal(int l, int r, node* a)
{
if(r-l == 1) //只有2个点的情况
{
return dis(a[l], a[r]);
}
if(r-l == 2) //有3个点的情况
{
double tmp1 = dis(a[l],a[l+1]);
double tmp2 = dis(a[l+1],a[r]);
double tmp3 = dis(a[l],a[r]);
return min(tmp1, min(tmp2,tmp3));
}
int mid = (l+r)/2;
double min_d = min(binaryCal(l,mid,a), binaryCal(mid+1,r,a));
double sqrt_min_d = sqrt(min_d);
int pos = 0;
for(int i=l;i<=r;i++)
{
if(a[i].x < a[mid].x + sqrt_min_d && a[i].x > a[mid].x - sqrt_min_d)
b[++pos] = a[i];
}//将位于[L-d,L+d]范围的点保存到b数组里面
sort(b+1,b+1+pos,cmpy); //按照y值进行排序
for(int i=1;i<=pos;i++)
for(int j=i+1;j<=pos;j++)
{
if(b[j].y - b[i].y > sqrt_min_d)
break;
min_d = min(min_d,dis(b[i],b[j]));
}
return min_d;
}
int main()
{
int N;
while(scanf("%d",&N)!=EOF)
{
if(N==0) break;
for(int i=1;i<=N;i++)
scanf("%lf%lf",&a[i].x, &a[i].y);
double ans = 0.0;
sort(a+1,a+1+N,cmpx);
ans = binaryCal(1,N,a);
printf("%.2lf\n",sqrt(ans)/2); //最后再处理开平方问题
}
return 0;
}
Hdoj 1007 Quoit Design 题解的更多相关文章
- 最近点对问题 POJ 3714 Raid && HDOJ 1007 Quoit Design
题意:有n个点,问其中某一对点的距离最小是多少 分析:分治法解决问题:先按照x坐标排序,求解(left, mid)和(mid+1, right)范围的最小值,然后类似区间合并,分离mid左右的点也求最 ...
- hdu 1007 Quoit Design 题解
原题地址 题目大意 查询平面内最近点对的距离,输出距离的一半. 暴力做法 枚举每一个点对的距离直接判断,时间复杂度是 $ O(n^2) $,对于这题来说会超时. 那么我们考虑去优化这一个过程,我们在求 ...
- 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(二分+浮点数精度控制)
Quoit Design Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- 杭电OJ——1007 Quoit Design(最近点对问题)
Quoit Design Problem Description Have you ever played quoit in a playground? Quoit is a game in whic ...
- poj 1007 Quoit Design(分治)
Quoit Design Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- hdu 1007 Quoit Design (最近点对问题)
Quoit Design Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- HDU 1007 Quoit Design【计算几何/分治/最近点对】
Quoit Design Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- hdu 1007 Quoit Design 分治求最近点对
Quoit Design Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
随机推荐
- Solrcloud(Solr集群)
Solrcloud(Solr集群) Solrcloud介绍: SolrCloud(solr集群)是Solr提供的分布式搜索方案. 当你需要大规模,容错,分布式索引和检索能力时使用SolrCloud. ...
- 使用HDTune规避硬盘上损坏的扇区
如何使用HDTune扫描磁盘上的错误在网上已经有很多帖子了,但扫描到之后如何用HDTune来规避硬盘上损坏的扇区呢? HDTune并不能直接规避,而是需要重新划分磁盘的卷.HDTune一行有50个小方 ...
- Java Core - static关键字的理解
一.基本常识 二.关于main方法 我们最常见的static方法就是main方法,至于为什么main方法必须是static的,现在就很清楚了.因为程序在执行main方法的时候没有创建任何对象,因此只有 ...
- .net 报错汇总——持续更新
1.未能找到 CodeDom 提供程序类型“Microsoft.CodeDom.Providers.DotNetCompilerPla PM> Install-Package Microsoft ...
- 注入技术--LSP劫持注入
1.原理 简单来说,LSP就是一个dll程序. 应用程序通过winsock2进行网络通信时,会调用ws2_32.dll的导出函数,如connect,accept等. 而后端通过LSP实现这些函数的底层 ...
- React-Native windows环境搭建记录
1.安装jdk,SDK Jdk下载地址:http://www.oracle.com/technetwork/cn/java/javase/downloads/jdk8-downloads-213315 ...
- text-decoration、text-decoration-color、text-decoration-line、text-decoration-style属性
text-decoration:over-line 定义上划线 text-decoration:line-through 定义删除线 text-decoration:underline 定义下划 ...
- MyBaits全局配置文件的各项标签1
■dtd约束 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" ...
- win10远程桌面连接提示身份验证错误,要求的函数不受支持的解决方案
转自https://www.baidu.com/link?url=67JXh4h79mN47mEenuH_ElGkSh9_GdOiY-Xp9Ihw0_mQIZHrPx-HxY3EIm_nTZKPoRZ ...
- 读懂掌握 Python logging 模块源码 (附带一些 example)
搜了一下自己的 Blog 一直缺乏一篇 Python logging 模块的深度使用的文章.其实这个模块非常常用,也有非常多的滥用.所以看看源码来详细记录一篇属于 logging 模块的文章. 整个 ...