dp-最小点对问题
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-最小点对问题的更多相关文章
- HDU5900 QSC and Master(区间DP + 最小费用最大流)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5900 Description Every school has some legends, ...
- HDU5697 刷题计划 dp+最小乘积生成树
分析:就是不断递归寻找靠近边界的最优解 学习博客(必须先看这个): 1:http://www.cnblogs.com/autsky-jadek/p/3959446.html 2:http://blog ...
- 【BZOJ4200】[Noi2015]小园丁与老司机 DP+最小流
[BZOJ2839][Noi2015]小园丁与老司机 Description 小园丁 Mr. S 负责看管一片田野,田野可以看作一个二维平面.田野上有 nn 棵许愿树,编号 1,2,3,…,n1,2, ...
- CodeForces E. Goods transportation【最大流+dp最小割】
妙啊 首先暴力建图跑最大流非常简单,s向每个i连流量为p[i]的边,每个i向t连流量为s[i]的边,每个i向j连流量为c的边(i<j),但是会又T又M 考虑最大流=最小割 然后dp求最小割,设f ...
- 『Tree nesting 树形状压dp 最小表示法』
Tree nesting (CF762F) Description 有两个树 S.T,问 S 中有多少个互不相同的连通子图与 T 同构.由于答案 可能会很大,请输出答案模 1000000007 后的值 ...
- 牛客寒假算法基础集训营2 【处女座与复读机】DP最小编辑距离【模板题】
链接:https://ac.nowcoder.com/acm/contest/327/G来源:牛客网 一天,处女座在牛客算法群里发了一句“我好强啊”,引起无数的复读,可是处女座发现复读之后变成了“处女 ...
- kuangbin带你飞dp专题-基础dp
dp HDU - 1257 最少拦截系统 最长递增子序列 #include<iostream> using namespace std; const int maxn=1e7; int a ...
- 常规DP专题练习
POJ2279 Mr. Young's Picture Permutations 题意 Language:Default Mr. Young's Picture Permutations Time L ...
- kuangbin 基础DP集合
HDU 1024第一遍水过,没有体会到这个题的奥妙,思考了很久终于体会了.大概意思是求把序列分成m段的子序列,并不一定要覆盖完,求子序列和的最大值我们首先要写出基本的动态转移方程: DP:dp[ i ...
- POJ 2373 Dividing the Path (单调队列优化DP)题解
思路: 设dp[i]为覆盖i所用的最小数量,那么dp[i] = min(dp[k] + 1),其中i - 2b <= k <= i -2a,所以可以手动开一个单调递增的队列,队首元素就是k ...
随机推荐
- 【LABVIEW到C#】1》ini的操作
using System; using System.IO; using System.Drawing; using System.Collections; using System.Componen ...
- Linux下安装scrapy包出错
pip install -i https://pypi.douban.com/simple/ scrapy 出现错误: error: command 将依赖包装全. sudo apt-get inst ...
- TreeView的用法总结
1.循环往treeview中添加数据 public AuthorNavUserControl() { InitializeComponent(); LoadTrees(MainForm.Project ...
- WIN10更新后出现无法联网的问题
以管理员身份运行CMD,运行以下命令: netsh winsock reset 具体可参考如下文章: http://www.sohu.com/a/124870273_490596 https://ji ...
- android sdk国内服务器下载
推荐使用国内东软的服务器下载android sdk相关: 如果是android sdk manager: HTTP Proxy Server : mirrors.neusoft.edu.cn HTTP ...
- XE7 UTF8Encode
之前用D7写的客户端程序升级到XE7,服务端依旧用D7.使用TIdHTTP控件 Get(URL)方法,服务端(TIdHttpServer)收到的中文字符解释成乱码. 鼓捣了一会,这么搞定的: 1. 客 ...
- Android Studio 学习 - Activity生命周期
落下两晚了,继续学习…… 先粘贴2张官方给的流程图: ------------------------------------------------------------------------- ...
- poj1321
这个题要是乍一看很难会想深搜,确实如此,可如果知道了深搜的方法,这个题就简 了不少,至于用深搜的时候要考虑当k==n和k<n时这咱种情况,当K==n时,当然很好想 到深搜搜下很容易找到所有方法, ...
- CodeForces - 900D: Unusual Sequences (容斥&莫比乌斯&组合数学)
Count the number of distinct sequences a1, a2, ..., an (1 ≤ ai) consisting of positive integers such ...
- Python学习笔记一(基础信息)
目录 输入输出 数据类型和变量 整数 浮点数 字符串 布尔值 空值 变量 常量 小结 欢迎关注我的博客我在马路边 说明:此笔记不是从零开始,在学习的过程中感觉需要记录一些比较重要和需要重复浏览的信息, ...