题目意思很简单,意思就是求一个图上最近点对。

具体思想就是二分法,这里就不做介绍,相信大家都会明白的,在这里我说明一下如何进行拼合。

具体证明一下为什么只需要检查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 (最近点对)的更多相关文章

  1. 杭电OJ——1007 Quoit Design(最近点对问题)

    Quoit Design Problem Description Have you ever played quoit in a playground? Quoit is a game in whic ...

  2. hdu 1007 Quoit Design (最近点对问题)

    Quoit Design Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  3. 最近点对问题 POJ 3714 Raid && HDOJ 1007 Quoit Design

    题意:有n个点,问其中某一对点的距离最小是多少 分析:分治法解决问题:先按照x坐标排序,求解(left, mid)和(mid+1, right)范围的最小值,然后类似区间合并,分离mid左右的点也求最 ...

  4. Hdoj 1007 Quoit Design 题解

    Problem Description Have you ever played quoit in a playground? Quoit is a game in which flat rings ...

  5. HDU 1007 Quoit Design最近点对( 分治法)

    题意: 给出平面上的n个点,问任意点对之间的最短距离是多少? 思路: 先将所有点按照x坐标排序,用二分法将n个点一分为二个部分,递归下去直到剩下两或一个点.对于一个部分,左右部分的答案分别都知道,那么 ...

  6. ZOJ2107 Quoit Design 最近点对

    ZOJ2107 给定10^5个点,求距离最近的点对的距离. O(n^2)的算法是显而易见的. 可以通过分治优化到O(nlogn) 代码很简单 #include<iostream> #inc ...

  7. Quoit Design(最近点对+分治)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1007 Quoit Design Time Limit: 10000/5000 MS (Java/Oth ...

  8. Quoit Design(hdu1007)最近点对问题。模版哦!

    Quoit Design Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...

  9. ZOJ 2017 Quoit Design 经典分治!!! 最近点对问题

    Quoit Design Time Limit: 5 Seconds      Memory Limit: 32768 KB Have you ever played quoit in a playg ...

随机推荐

  1. linux下载文件到本地

    使用XShell工具 1.首先虚拟机要联网 2.服务器要安装了rz,sz yum install lrzsz 运行rz,会将windows的文件传到linux服务器   运行sz filename,会 ...

  2. elasticsearch-6.0.1安装

    elasticsearch-6.0.1安装 0. 介绍:     ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎:是目前全文搜索引擎的首选. ...

  3. vue-cli 中多个组件共用一个mt-checklist

    // html <div v-if="dataList"> <mt-popup v-model="popupVisible" position ...

  4. Python之向函数传递元组和字典

    也可以在函数定义时加上这两个参数用以接收多余的参数哦~

  5. input输入框数字转带千分位的字符串

    数字转带千分位的字符串 思路 先获取要转换的数字,对其进行分割 小数部分具体需要保留多少位,具体处理 整数部分用正则做替换 将小数部分和整数部分合计 代码 注意: 本文是基于 jQuery 写的,稍稍 ...

  6. CSS新特性(3D转换,perspective(透视),transfrom-style(子元素是否开启三维环境))

    1. 三维坐标系(里面的值不能省略,没有就写 0 ) x 轴:水平向右    注意:x 右边是正值,左边是负值 y轴: 垂直向下    注意:y 下面是正值,上面是负值 z轴:垂直屏幕     注意: ...

  7. Java 简单链表实现

    1.初衷 最近在看Java基础,有一章节涉及到链表,便记之所学所得. 2.链表的定义 链表是存储地址不连续的线性存储结构 3.链表的基本结构 一个节点包含当前节点,与下个节点的引用 4.简单链表的实现 ...

  8. Codeforces 1111E DP + 树状数组 + LCA + dfs序

    题意:给你一颗树,有q次询问,每次询问给你若干个点,这些点可以最多分出m组,每组要满足两个条件:1:每组至少一个点,2:组内的点不能是组内其它点的祖先,问这样的分组能有多少个? 思路:https:// ...

  9. 转帖 使用eclipse创建之前没有创建的web.xml

    由于在下学习Java的时间不长,所以对于一些工具的使用不太熟悉,特别是eclipse,虽然这是一款强大的Java编译工具但是现有汉化版.所以在实际使用的时候难免会遇到各种各样的麻烦.今天就遇到了一个: ...

  10. React 表单元素实例

    代码实例: <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset=" ...