Input The input consists of several test cases. For each case, the first line contains an integer N (2 <= N <= 100,000), the total number of toys in the field. Then N lines follow, each contains a pair of (x, y) which are the coordinates of a toy. The input is terminated by N = 0.
Output For each test case, print in one line the radius of the ring required by the Cyberground manager, accurate up to 2 decimal places.
Sample Input 2 0 0 1 1 2 1 1 1 1 3 -1.5 0 0 0 0 1.5 0
Sample Output 0.71 0.00 0.75
代码:(转载)
#include <iostream>#include <algorithm>#include <cmath>using namespace std;
struct node{double x,y;}point[100000];int n;
bool cal_less(node p1,node p2){if(p1.x != p2.x) return p1.x < p2.x;else return p1.y < p2.y;}
double dist(node a, node b){return sqrt((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y));}
double getmin(double a, double b){ return a<b?a:b;}
double solve(int l,int r){if(l == r) return 1000000000;if(l == r - 1) return dist(point[l],point[r]);if(l == r - 2) return getmin(getmin(dist(point[l],point[l+1]),dist(point[l+1],point[l+2])),dist(point[l],point[l+2]));int i,j,mid = (l+r) >> 1;double curmin = getmin(solve(l,mid),solve(mid+1,r));for(i=l;i<=r;i++) for(j=i+1;j<=i+5 && j<=r;j++) { curmin = getmin(curmin,dist(point[i],point[j])); }return curmin;}
int main() {int i;while(scanf("%d",&n)!=EOF && n){ for(i=0;i<n;i++) scanf("%lf %lf",&point[i].x,&point[i].y); sort(point,point+n,cal_less); double ans = solve(0,n-1); printf("%.2lf/n",ans/2);}return 0;}
原创代码:
#include<cstdio>#include<cmath>#include<algorithm>using namespace std;
struct point{ double x; double y;}p[1000000];
bool cal_less(point p1,point p2){ if(p1.x != p2.x) return p1.x < p2.x; else return p1.y < p2.y;}
double dis(point p1,point p2){ return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));}double getmin(double a,double b){ return a<b?a:b;
}double getmin(point p1,point p2, point p3){ double a=dis(p1,p2); double b=dis(p3,p2); double c=dis(p1,p3); if(a<b) { if(a<c) return a; else return c; } else { if(b>c) return c; else return b; }}double search(int l,int r){ if(l==r) return 100000000; if(l+1==r) return dis(p[l],p[r]); if(l+2==r) return getmin(p[l],p[l+1],p[r]); int mid=(l+r)/2; double curmin=getmin(search(l,mid),search(mid+1,r));
for(int i=l;i<=mid+1;i++) if(p[i].x-p[mid].x<=curmin) for(int j=i+1;j<i+6;j++) if(dis(p[i],p[j])<curmin) curmin=dis(p[i],p[j]); return curmin;}
int main(){ int n; scanf("%d",&n); while(n>0) { for(int i=0;i<n;i++) scanf("%lf%lf",&p[i].x,&p[i].y); sort(p,p+n,cal_less); printf("%.2lf/n",search(0,n-1)/2); scanf("%d",&n); } return 0;}