【HDOJ】P1007 Quoit Design (最近点对)
题目意思很简单,意思就是求一个图上最近点对。
具体思想就是二分法,这里就不做介绍,相信大家都会明白的,在这里我说明一下如何进行拼合。
具体证明一下为什么只需要检查6个点
首先,假设当前左侧和右侧的最小值为d,那么对于一个点,如果有个最小值小于d,那么一定存在于上d下d左d右d的一块区域内,又因为是从左到右,从上到下,所以左侧的那部分匹配的区域会重叠,也就是对于左侧的区域,完全没有必要去进行匹配。所以只需要对右侧d,上下d的区域进行匹配,而假设这个区域内的所以点的距离为d那么最多为6个,那么如果长度小于d那么根据抽屉原理可以知道最多为6个。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#define MaxN 100001
using namespace std; int N,t[MaxN],k;
struct Posi{
double x,y;
}point[MaxN]; bool compoint(Posi a,Posi b){
return a.x!=b.x?a.x<b.x:a.y<b.y;
} bool comp(int a,int b){
return point[a].y<point[b].y;
} inline double dist(int a,int b){
return sqrt((point[a].x-point[b].x)*(point[a].x-point[b].x)+(point[a].y-point[b].y)*(point[a].y-point[b].y));
} double solve(int l,int r){
if (l==r) return 1e30;
if (l+1==r) return dist(l,r);
int mid=(l+r)>>1;
double ld=solve(l,mid);
double rd=solve(mid+1,r);
double d=min(ld,rd);
k=0;
for (int i=l;i<=r;i++)
if (fabs(point[i].x-point[mid].x)<d) t[++k]=i;
sort(t+1,t+k+1,comp);
for (int i=1;i<k;i++)
for (int j=i+1;j<=k && fabs(point[t[j]].y-point[t[i]].y)<d;j++){
double newd=dist(t[i],t[j]);
if (newd<d) d=newd;
}
return d;
} int main(){
while(cin>>N,N!=0){
for (int i=1;i<=N;i++) scanf("%lf%lf",&point[i].x,&point[i].y);
sort(point+1,point+N+1,compoint);
printf("%.2lf\n",solve(1,N)/2);
}
return 0;
}
【HDOJ】P1007 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 ...
- 最近点对问题 POJ 3714 Raid && HDOJ 1007 Quoit Design
题意:有n个点,问其中某一对点的距离最小是多少 分析:分治法解决问题:先按照x坐标排序,求解(left, mid)和(mid+1, right)范围的最小值,然后类似区间合并,分离mid左右的点也求最 ...
- Hdoj 1007 Quoit Design 题解
Problem Description Have you ever played quoit in a playground? Quoit is a game in which flat rings ...
- HDU 1007 Quoit Design最近点对( 分治法)
题意: 给出平面上的n个点,问任意点对之间的最短距离是多少? 思路: 先将所有点按照x坐标排序,用二分法将n个点一分为二个部分,递归下去直到剩下两或一个点.对于一个部分,左右部分的答案分别都知道,那么 ...
- ZOJ2107 Quoit Design 最近点对
ZOJ2107 给定10^5个点,求距离最近的点对的距离. O(n^2)的算法是显而易见的. 可以通过分治优化到O(nlogn) 代码很简单 #include<iostream> #inc ...
- 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 ...
随机推荐
- shiro安全框架的使用流程
最近学了shiro安全框架流程,在这里梳理一下shiro的工作流程和一些代码,方便以后使用的时候,能快速找到对应的代码. 要使用这个shiro框架,还要新建两张表 t_authority(权限表)和t ...
- CSS 中 transform、animation、transition、translate的区别
在前端页面的开发过程中,经常会碰到这么几个 CSS 属性容易搞混:transform.translate.animation还有transition.下面就针对这几个 CSS 属性做一个对比,辨别这几 ...
- 面试经典:链表中倒数第k个结点?如何从大量数据中找出高频词?
记录两道面试题: 题目描述: 输入一个链表,输出该链表中倒数第k个结点.(单向链表) 拿到这个问题的时候自然而然会想到让链表从末尾开始next K-1 次不就是第K-1个节点了么,但是必须要注意一 ...
- svnlook - Subversion 仓库检索工具
SYNOPSIS 总览 svnlook command /path/to/repos [options] [args] OVERVIEW 概述 Subversion 是一个版本控制系统,允许保存旧版本 ...
- shell 符号的定义(一)
在shell中,在判断数值大小除了可以用”(( ))”的形式外,还可以使用”[ ]”.但是就不能使用>, < , = 这样的符号了,要使用 -lt (小于),-gt (大于),-le (小 ...
- icomoon字体图标引用代码
1.第一步在样式里声明字体:告诉别人我们自己定义的字体. @font-face{ /*声明字体 引用字体*/ font-family:'icomoon'; src:url('fonts/icomoon ...
- 关于C#的随机数
一直都知道random随机数可能出现相同的情况,但是一直没具体看为什么,网上一看又是一大堆例子给你出来,一点也不清晰,今天看msdn记录一下,msdn是讲的真的清楚. 实例化随机数生成器 通过向Ran ...
- Go基础之基本数据类型
Go基础之基本数据类型 基本数据类型 整形 int8.int16.int32.int64 无符号整形:uint8.uint16.uint32.uint64 uint8就是我们熟知的byte型 类型 描 ...
- How To Use PostgreSQL with Your Ruby on Rails Application on Ubuntu 14.04
How To Use PostgreSQL with Your Ruby on Rails Application on Ubuntu 14.04 链接来自于:https://www.digitalo ...
- iOS 几种定时器
//第一种 每一秒执行一次(重复性) double delayInSeconds = 1.0; timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_ ...