hdu 1007 分治
来源:互联网 发布:游戏设计软件下载 编辑:程序博客网 时间:2024/05/23 23:10
题意:求最近点对
暴力一定超时,分治:(代码参考别人)
求最大的环,此环只能套中一个,所以只能先找出距离最小的两点且其距离就是环的直径,不然该环就有可能一次套中两个环。所以这题的题意是:求最近点对。
#include<iostream>#include<string.h>#include<stdio.h>#include<math.h>#include<algorithm>#define DX(x) ((x)*(x))using namespace std;const int MAX=100000+1;int n;struct Point{ double x,y; int index;}a[MAX],b[MAX],c[MAX];double getdis(Point a,Point b){ return sqrt(DX(a.x-b.x)+DX(a.y-b.y));}/*double getmin(double a,double b){ if(a<b) return a; else return b;}*/inline double getmin(double a, double b) { return a < b ? a : b; }bool cmpx(const Point& a,const Point& b){ if(a.x==b.x) return a.y<b.y; return a.x<b.x;}bool cmpy(const Point& a,const Point& b){ if(a.y==b.y) return a.x<b.x; return a.y<b.y;}void merget(Point b[],Point c[],int p,int m,int q) //合并 { int i,j,k; for(i=p,k=p,j=m+1;i<=m&&j<=q;) //两边都是按y从小到大排列,所以只用比较 //两边的最左方的y值,即可得总的y的升序排列 { if(c[i].y>c[k].y) b[k++]=c[i], j++; else b[k++]=c[i],i++; } while(i<=m) b[k++]=c[i++]; while(j<=q) b[k++]=c[j++];}double closet(Point a[],Point b[],Point c[],int p,int q){ double d1,d2; if(q - p == 1) return getdis(a[p],a[q]); if(q - p == 2) { double x1=getdis(a[p],a[p+1]); double x2=getdis(a[p],a[q]); double x3=getdis(a[p+1],a[q]); return getmin(x1,getmin(x2,x3)); } int m=(q + p)/2,i,j,k; //为了正确 的分治、 for(i = p,j = p,k = m + 1; i <=q; ++i) { if(b[i].index<=m) c[j++]=b[i]; else c[k++]=b[i]; } d1=closet(a,c,b,p,m); d2=closet(a,c,b,m+1,q); merget(b,c,p,m,q); double dm=getmin(d1,d2); for(i = p, k = p;i <= q;++i) { if(fabs(b[i].x-b[m].x) < dm) c[k++]=b[i]; } for(i = p; i < k; ++i) { for(j = i + 1; j < k && c[j].y - c[i].y < dm; ++j) { double temp=getdis(c[i],c[j]); if(temp < dm) dm=temp; } } return dm;}int main(){ while(scanf("%d",&n)!=EOF&&n!=0) { for(int i=0;i<n;i++) {scanf("%lf%lf",&a[i].x,&a[i].y); } sort(a,a+n,cmpx); for(int i=0;i<n;i++) a[i].index=i; memcpy(b,a,n*sizeof(b[0])); sort(b,b+n,cmpy); double dis=closet(a,b,c,0,n-1); printf("%.2lf\n",dis/2.0); } return 0;}
注1:
- hdu 1007 分治
- hdu 1007 (分治)
- 【分治】hdu 1007
- Quoit Design - HDU 1007 分治
- hdu 1007(分治法应用)
- HDU 1007 (分治递归)
- 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 最近点对-分治法
- HDU 1007 Quoit Design(分治)
- Android SDK 下载或更新出现问题的解决办法
- 有关虚拟机使用的一点感想
- JavaScript的多态经典案例
- PROC SQL中的逻辑判别和描述性统计函数
- 第七周实验报告2
- hdu 1007 分治
- eclipse文件
- qt移植过程中出现QSQLITE driver not loaded 的解决办法
- 字符串相乘:void mul(char *input1,int n1,char *input2,int n2,char *output)
- 黑马程序员_android笔记3
- python的概念层次
- 40种孩子技能
- 10000 things all ICS students should do before graduating
- SDL_gfx-2.0.23在windows平台下的编译及例子