标签:
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 36793 Accepted Submission(s): 9552
分析:分治与递归
程序:
#include<cmath> #include<algorithm> using namespace std; int n; struct node { double x; double y; }p[100005]; int a[100005]; double cmpx(node a,node b) { return a.x<b.x; } double cmpy(int a,int b) { return p[a].y<p[b].y; } double min(double a,double b) { return a<b?a:b; } double dis(node a,node b) { return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } double find(int l,int r) { if(r==l+1) return dis(p[l],p[r]); if(l+2==r) return min(dis(p[l],p[r]),min(dis(p[l],p[l+1]),dis(p[l+1],p[r]))); int mid=(l+r)>>1; double ans=min(find(l,mid),find(mid+1,r)); int i,j,cnt=0; for(i=l;i<=r;i++) { if(p[i].x>=p[mid].x-ans&&p[i].x<=p[mid].x+ans) a[cnt++]=i; } sort(a,a+cnt,cmpy); for(i=0;i<cnt;i++) { for(j=i+1;j<cnt;j++) { if(p[a[j]].y-p[a[i]].y>=ans) break; ans=min(ans,dis(p[a[i]],p[a[j]])); } } return ans; } int main() { int i; while(scanf("%d",&n)!=EOF) { if(!n) break; for(i=0;i<n;i++) scanf("%lf %lf",&p[i].x,&p[i].y); sort(p,p+n,cmpx); printf("%.2lf%\n",find(0,n-1)/2); } return 0; }
标签:
原文地址:http://www.cnblogs.com/mypsq/p/4480703.html