hdu 1007 寻找最近点对
2014-03-16 23:02
232 查看
自己是新手,拿到题目直接两重循环,结果TLE,上网搜索寻找最近点对,发现分治算法,学习了。
#include<cmath> #include<cstdio> #include<algorithm> #define Min(a,b) (a<b?a:b) using namespace std; struct Points { double x,y; }a[100005]; int temp[100005]; bool cmpx(const Points a,const Points b) { if(a.x == b.x) return a.y < b.y; return a.x < b.x; } bool cmpy(const int& i,const int& j) { if(a[i].y == a[j].y) return a[i].x < a[j].x; return a[i].y < a[j].y; } double getdis(int i,int j) { double x=a[i].x-a[j].x; double y=a[i].y-a[j].y; return sqrt(x*x+y*y); } double ClosePoint(int s,int e) { if( s >= e ) return 100000000.0;//如果子集为空,返回无穷大 int mid = (s+e)/2,k=0; double dl = ClosePoint(s,mid);//求左边最近点 double dr = ClosePoint(mid+1,e);//右边 double d = Min(dl,dr),x0 = a[mid].x; for(int i = s;i <= e;i ++) if(fabs( x0 - a[i].x )<d) temp[k++]=i; sort(temp,temp+k,cmpy); for(int i=0; i<k ;i++) for(int j=i+1; j<k && a[temp[j]].y-a[temp[i]].y<d ;j++)//在2d之间的点按y排序后,筛选出两点,其y之差满足小于d d=Min(d,getdis(temp[i],temp[j])); return d; } int main() { int n; while( ~scanf("%d",&n) && n ) { for(int i=0;i<n;i++) scanf("%lf%lf",&a[i].x,&a[i].y); sort(a,a+n,cmpx); double ans=ClosePoint(0,n-1); printf("%.2lf\n",ans/2); } return 0; }
相关文章推荐
- hdu 1007 Quoit Design 最近点对
- hdu 1007 Quoit Design, 平面最近点对
- HDU-1007 Quoit Design 平面最近点对
- hdu 1007 Quoit Design(分治法求最近点对)
- hdu 1007 Quoit Design 求解最近对问题
- HDU 1007 Quoit Design(最近点对问题)
- hdu 1007 最近点对-分治法
- hdu 1007 最近点对 模板
- hdu 1007 Quoit Design (最近点对)
- HDU 1007 Quoit Design_二分法求最近点对
- Hdu 1007 - Quoit Design//分治,最近点对,计算几何
- hdu 1007最近点对
- HDU 1007 (最近点对+qsort对结构体的排序!!!)
- Hdu 1007 Quoit Design【最近点对】
- hdu 1007_平面最近点对模板
- HDU 1007 Quoit Design(计算几何の最近点对)
- hdu 1007 Quoit Design 最近点对
- HDU1007 平面最近点对
- hdu_1007_Quoit Design(最近点对)
- HDU 1007 Quoit Design 最近点对 分治法