标签:基本算法-分治
2 0 0 1 1 2 1 1 1 1 3 -1.5 0 0 0 0 1.5 0
0.71 0.00 0.75
#include <iostream> #include <cstdio> #include <vector> #include <cmath> #include <algorithm> #include <cstring> using namespace std; const double eps = 1e-7; const double INF = 100000000000; struct point{ double x , y; point(double a = 0 , double b = 0){ x = a , y = b; } }; vector<point> P; int N; bool cmp(point p1 , point p2){ if(p1.x == p2.x) return p1.y<p2.y; return p1.x<p2.x; } bool cmpy(point p1 , point p2){ return p1.y<p2.y; } void initial(){ P.clear(); } void readcase(){ double x , y; for(int i = 0; i < N; i++){ scanf("%lf%lf" , &x , &y); P.push_back(point(x , y)); } } double dis(point p1 , point p2){ return sqrt((p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y)); } double fenzhi(int l , int r){ if(l == r) return INF; if(r-l==1) return dis(P[l] , P[r]); int mid = (l+r)/2; double d = min(fenzhi(l,mid) , fenzhi(mid+1 , r)); int index = mid; vector<point> tP; for(int i = mid+1; i <= r; i++){ if(d-(P[i].x-P[mid].x) >= eps) tP.push_back(P[i]); } sort(tP.begin() , tP.end() , cmpy); while(d-(P[mid].x-P[index].x) >= eps && index >= l){ for(int i = 0; i < tP.size(); i++){ if(tP[i].y-P[index].y-d>=eps) break; d = min(d , dis(tP[i] , P[index])); } index--; } return d; } void computing(){ sort(P.begin() , P.end() , cmp); printf("%.2lf\n" , fenzhi(0 , N-1)/2); } int main(){ while(scanf("%d" , &N) && N){ initial(); readcase(); computing(); } return 0; }
poj 1007 Quoit Design(分治),布布扣,bubuko.com
标签:基本算法-分治
原文地址:http://blog.csdn.net/u011836218/article/details/32328627