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. mogon操作数据库

    返回的本来就是promise redis是内存数据库,更适合放session等一些东西.而mongo不是.

  2. 八大排序算法原理以及Java实现(直接插入排序)

    概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大, ...

  3. jstat 简介(2)

    jstat命令可以查看堆内存各部分的使用量,以及加载类的数量.命令的格式如下: jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数] 注意:使用的jdk版本是jdk8. 类加载统 ...

  4. 单链表输出倒数第k个结点值(栈实现)

    思路1:定义两个指针变量p和q,初始时均指向头节点的下一个节点(链表的第一个节点),p指针沿链表移动: 当p指针移动到第k个节点时,q指针开始与p指针同步移动, 当p指针移动到最后一个节点时,q指针所 ...

  5. python中读写LMDB数据库

    LMDB的全称是Lightning Memory-Mapped Database(快如闪电的内存映射数据库),它的文件结构简单,包含一个数据文件和一个锁文件: LMDB文件可以同时由多个进程打开,具有 ...

  6. windows下matplotlib的安装

    在上一篇中我想用matplotlib,无奈一直装不上,就在卸了又装装了又卸,反反复复之后,终于装好了. 初学python,首先就装了numpy,倒也没有多复杂,有需要的朋友可以直接http://sou ...

  7. CodeForces - 687D: Dividing Kingdom II (二分图&带权并查集)

    Long time ago, there was a great kingdom and it was being ruled by The Great Arya and Pari The Great ...

  8. 异步通信rabbitmq——消息重试

    目标: 利用RabbitMQ实现消息重试和失败处理,实现可靠的消费消费.在消息消费异常时,自动延时将消息重试,当重试超过一定次数后,则列为异常消息,等待后续特殊处理. 准备: TTL:Time-To- ...

  9. Word 2007 如何设置正文第一页----目录显示正文从第一页开始

    最近学校里开始要求写论文了,其中有个目录中的页码都不是从第一页开始的,毕竟前面还有封面.中英文摘要.目录等,所以正文内容就不是从第一页开始的了,但是很多的书上所有正文都是从第一页开始的,我的论文如何才 ...

  10. setcookie函数的注意事项

    函数说明 bool setcookie ( string $name [, string $value = "" [, int $expire = 0 [, string $pat ...