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 ...
随机推荐
- 使用HDTune规避硬盘上损坏的扇区
如何使用HDTune扫描磁盘上的错误在网上已经有很多帖子了,但扫描到之后如何用HDTune来规避硬盘上损坏的扇区呢? HDTune并不能直接规避,而是需要重新划分磁盘的卷.HDTune一行有50个小方 ...
- 软件工程(FZU2015) 赛季得分榜,第五回合
SE_FZU目录:1 2 3 4 5 6 7 8 9 10 11 12 13 积分规则 积分制: 作业为10分制,练习为3分制:alpha30分: 团队项目分=团队得分+个人贡献分 个人贡献分: 个人 ...
- Python之自测代码标识__name__=='__main__'
__name__是python的默认的自测代码标识,其他文件导入该python文件时,不会执行这行代码以下部分. def yangfan(a): print('yangfan %s' %a) prin ...
- 【kindle笔记】之 《恶意》-2018-4-20
[kindle笔记]读书记录-总 在答辩和考试和各种大作业的重压以及两天后全校停电的巨大挤压中,一口气读完了恶意这本书. 这本书是我读的东野圭吾的第二本书.第一本是心心念念的<解忧杂货店> ...
- 18-vue-cli脚手架项目中组件的使用
在webpack-simple模板中,包括webpck模板.一个.vue文件就是一个组件. 为什么会这样呢?因为webpack干活了!webpack的将我们所有的资源文件进行打包.同时webpack还 ...
- Jmeter之Constant Timer与constant throughput timer的区别(转)
当放置Constant Timer于两个http请求之间,那么它代表的含义是:在上一个请求发出至完成后, 开始Contant Timer指定的时间,最后再发出第二个请求.它并不是代表两个请求之间的发送 ...
- 记自己在mybatis中设置jdbcType的一个坑
项目是用ssm搭建的.主要是为app数据接口.其中有一个需求就app想要查询一段时间内某个用户的测量信息,所以app给我后端传递了3个参数,分别是appuserId(String),startDate ...
- Ajax发送请求等待时弹出模态框等待提示
主要的代码分为两块,一个是CSS定义模态框,另一个是在Ajax中弹出模态框. 查看菜鸟教程中的模态框教程demo,http://www.runoob.com/try/try.php?filename= ...
- PMP三点
三点估算:悲观36天,可能21天,乐观6天.在16至26天内完成的概率是多少?这个算法是PERT估算最终估算结果=(悲观工期+乐观工期+4×最可能工期)/6=(36+6++4*21)/6=21标准差= ...
- 解决方法:CentOS7用yum安装软件显示错误:cannot find a valid baseurl for repo: base/7/x86_64
在Linux学习中,发现使用yum安装软件出现以下的错误: 百度了各种方法,很多人也发现光是修改REBOOT=yes也没用,多次进行挂载.修改网卡配置文件.重置IP地址.重启网络.创建又删除配置文件的 ...