最近点对模版
来源:互联网 发布:tensorflow wordvec 编辑:程序博客网 时间:2024/05/21 06:58
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const double INF = 1e20; const int N = 100005; struct Point { double x; double y; }point[N]; int n; int tmpt[N]; bool cmpxy(const Point& a, const Point& b) { if(a.x != b.x) return a.x < b.x; return a.y < b.y; } bool cmpy(const int& a, const int& b) { return point[a].y < point[b].y; } double min(double a, double b) { return a < b ? a : b; } double dis(int i, int j) { return sqrt((point[i].x-point[j].x)*(point[i].x-point[j].x) + (point[i].y-point[j].y)*(point[i].y-point[j].y)); } double Closest_Pair(int left, int right) { double d = INF; if(left==right) return d; if(left + 1 == right) return dis(left, right); int mid = (left+right)>>1; double d1 = Closest_Pair(left,mid); double d2 = Closest_Pair(mid+1,right); d = min(d1,d2); int i,j,k=0; //分离出宽度为d的区间 for(i = left; i <= right; i++) { if(fabs(point[mid].x-point[i].x) <= d) tmpt[k++] = i; } sort(tmpt,tmpt+k,cmpy); //线性扫描 for(i = 0; i < k; i++) { for(j = i+1; j < k && point[tmpt[j]].y-point[tmpt[i]].y<d; j++) { double d3 = dis(tmpt[i],tmpt[j]); if(d > d3) d = d3; } } return d; } int main() { while(scanf("%d",&n)&&n) { if(n==0) break; for(int i = 0; i < n; i++) scanf("%lf %lf",&point[i].x,&point[i].y); sort(point,point+n,cmpxy); printf("%.2lf\n",Closest_Pair(0,n-1)/2);// 除以2后为两点间的距离的一半 } return 0; }
阅读全文
1 0
- 最近点对模版
- Quoit Design(hdu1007)最近点对问题。模版哦!
- 最近点对算法
- 最近点对
- 最近点对问题
- 求最近点对
- 最近点对
- 最近点对问题
- 平面最近点对
- 最近点对
- 求最近点对
- 平面最近点对
- 寻找最近点对
- 最近点对问题
- 2.11 最近点对
- 最近点对
- 求最近点对
- 最近点对问题
- [题解]hdu1542 Atlantis
- 前端拖拽插件gridster.js介绍与使用示例
- java实现时间复杂度O(1)的LFU缓存
- 内置的验证约束注解
- C++ 判断文件文件夹是否存在
- 最近点对模版
- Hibernate错误记录(一): Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPe
- Gh0st 3.6 存在的BUG及修改方法(收集整理)
- 实验一下CSDN的公开时间
- Java多线程(五)之BlockingQueue深入分析
- thinkphp生成的验证码不显示问题解决
- Ping pong(树状数组)
- [leetcode] 2. Add Two Numbers(链表、大数相加)
- leetcode 508. Most Frequent Subtree Sum