dp-最小点对问题

//最小点对问题
//采用分治思想,先分成两个子集分别求出最短距离d
//再对两个子集进行合并,在一个dx2d的矩形中,最多可能有6个点距离小于d
//按y排序,当x增长时求出这6个点的最小距离d2
//ans=min(d,d2),O(nlogn) #include<stdio.h>
#include<time.h>
#include<math.h>
#include<algorithm> #define LENGTH 100001
#define INF 1e20 struct point
{
double x;
double y;
}p[LENGTH],tmp[LENGTH]; double dist(point a,point b) { return sqrt(pow(a.x-b.x,2)+pow(a.y-b.y,2)); }
double min(double a,double b) { return a<b?a:b; }
bool cpx(point a,point b) { return a.x<b.x; }
bool cpy(point a,point b) { return a.y<b.y; } double mindist(int l,int r)
{
double d=INF;
if(r==l)
return d;
if(r-l==1)
return dist(p[l],p[r]);
if(r-l==2)
return min(dist(p[l],p[l+1]),min(dist(p[l],p[r]),dist(p[l+1],p[r]))); int mid=(r+l)>>1;
d=min(mindist(l,mid),mindist(mid+1,r)); int k=0;
for(int i=l;i<=r;i++)
if(fabs(p[i].x-p[mid].x)<=d)
{
tmp[k++]=p[i];
if(k>5) break;//最多只有6个点
}
std::sort(tmp,tmp+k,cpy);
for(int i=0;i<k;i++)
for(int j=i+1;j<k&&tmp[j].y-tmp[i].y<d;j++)
{
double t=dist(tmp[i],tmp[j]);
if(t<d) d=t;
} return d;
} int main()
{
while(1)
{
int n;
scanf("%d",&n);
if(n==0) break; for(int i=0;i<n;i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
std::sort(p,p+n,cpx);
printf("%.2f\n",mindist(0,n-1)/2);
}
}
  • 测试用例

输入样例:

    2

    0 0

    1 1

    2

    1 1

    1 1

    3

    -1.5 0

    0 0

    0 1.5

    0

  输出样例:

    0.71

    0.00

    0.75

dp-最小点对问题的更多相关文章

  1. HDU5900 QSC and Master(区间DP + 最小费用最大流)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5900 Description Every school has some legends, ...

  2. HDU5697 刷题计划 dp+最小乘积生成树

    分析:就是不断递归寻找靠近边界的最优解 学习博客(必须先看这个): 1:http://www.cnblogs.com/autsky-jadek/p/3959446.html 2:http://blog ...

  3. 【BZOJ4200】[Noi2015]小园丁与老司机 DP+最小流

    [BZOJ2839][Noi2015]小园丁与老司机 Description 小园丁 Mr. S 负责看管一片田野,田野可以看作一个二维平面.田野上有 nn 棵许愿树,编号 1,2,3,…,n1,2, ...

  4. CodeForces E. Goods transportation【最大流+dp最小割】

    妙啊 首先暴力建图跑最大流非常简单,s向每个i连流量为p[i]的边,每个i向t连流量为s[i]的边,每个i向j连流量为c的边(i<j),但是会又T又M 考虑最大流=最小割 然后dp求最小割,设f ...

  5. 『Tree nesting 树形状压dp 最小表示法』

    Tree nesting (CF762F) Description 有两个树 S.T,问 S 中有多少个互不相同的连通子图与 T 同构.由于答案 可能会很大,请输出答案模 1000000007 后的值 ...

  6. 牛客寒假算法基础集训营2 【处女座与复读机】DP最小编辑距离【模板题】

    链接:https://ac.nowcoder.com/acm/contest/327/G来源:牛客网 一天,处女座在牛客算法群里发了一句“我好强啊”,引起无数的复读,可是处女座发现复读之后变成了“处女 ...

  7. kuangbin带你飞dp专题-基础dp

    dp HDU - 1257 最少拦截系统 最长递增子序列 #include<iostream> using namespace std; const int maxn=1e7; int a ...

  8. 常规DP专题练习

    POJ2279 Mr. Young's Picture Permutations 题意 Language:Default Mr. Young's Picture Permutations Time L ...

  9. kuangbin 基础DP集合

    HDU 1024第一遍水过,没有体会到这个题的奥妙,思考了很久终于体会了.大概意思是求把序列分成m段的子序列,并不一定要覆盖完,求子序列和的最大值我们首先要写出基本的动态转移方程: DP:dp[ i ...

  10. POJ 2373 Dividing the Path (单调队列优化DP)题解

    思路: 设dp[i]为覆盖i所用的最小数量,那么dp[i] = min(dp[k] + 1),其中i - 2b <= k <= i -2a,所以可以手动开一个单调递增的队列,队首元素就是k ...

随机推荐

  1. SqlCacheDependency:asp.net SQL缓存依赖

    先看下MSDN对此类的介绍: 在以下两者之间建立关系:一是在 ASP.NET 应用程序的 Cache 对象中存储的项:二是特定 SQL Server 数据库表或  SQL Server 2005 查询 ...

  2. python中的类和对象

    类和对象 1. 类和对象和概念 类:共性事物的抽象,是对某一类具有共同事物的描述,是具有相同属性和方法的集合 对象:类的实例,是共性事物的一个体现,是这类事物中的每个个体 2. 总结: 类是对象的模板 ...

  3. ASP.NET Core 配置文件(无处不在的依赖注入)

    前烟: .NET Core 中取消了以往的 XML 节点配置文件,改用了 *.json 格式. 在 Startup.cs 文件中,构造方法 build appsetting.json 文件, 本文主要 ...

  4. android:descendantFocusability用法简析(转)

        开发中很常见的一个问题,项目中的listview不仅仅是简单的文字,常常需要自己定义listview,自己的Adapter去继承BaseAdapter,在adapter中按照需求进行编写,问题 ...

  5. pandas 中文快速查询手册

    本文翻译自文章: Pandas Cheat Sheet - Python for Data Science ,同时添加了部分注解. 对于数据科学家,无论是数据分析还是数据挖掘来说,Pandas是一个非 ...

  6. LeetCode OJ:Combinations (排列组合)

    Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For exampl ...

  7. 源码编译安装mysql5.6

    1.download the source package and unzip to the destination dir http://mirror.switch.ch/mirror/mysql/ ...

  8. nyoj-1132-promise me a medal(求线段交点)

    题目链接 /* Name:nyoj-1132-promise me a medal Copyright: Author: Date: 2018/4/26 20:26:22 Description: 向 ...

  9. BEC listen and translation exercise 13

    The old lady sits on a mobile chair every morning. He got a large fortune when his father died, but ...

  10. c++ 修改stl set中的元素

    set的迭代器it有const修饰符,那么对它元素的修改就必然不能成功了.但是有时候遇到要修改stl set元素的问题,这个问题一般的解决方法是先erase这个元素,然后再insert,这样效率很低, ...