标签:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3007
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cmath> 6 #include<algorithm> 7 #include<vector> 8 #define inf 0x7fffffff 9 #define exp 1e-10 10 #define PI 3.141592654 11 using namespace std; 12 const int maxn=500+10; 13 14 int n; 15 struct Point 16 { 17 double x,y; 18 Point(double x=0,double y=0):x(x),y(y){} 19 }an[maxn],bn[maxn]; 20 typedef Point Vector; 21 double dcmp(double x) 22 { 23 if (fabs(x)<exp) return 0; 24 return x<0 ? -1 : 1; 25 } 26 Vector operator + (Vector A,Vector B) {return Vector(A.x+B.x , A.y+B.y); } 27 Vector operator - (Vector A,Vector B) {return Vector(A.x-B.x , A.y-B.y); } 28 Vector operator * (Vector A,double p) {return Vector(A.x*p , A.y*p); } 29 Vector operator / (Vector A,double p) {return Vector(A.x/p , A.y/p); } 30 bool operator < (Point a,Point b) {return a.x<b.x || (a.x==b.x && a.y<b.y); } 31 bool operator == (Point a,Point b) {return dcmp(a.x-b.x)==0 && dcmp(a.y-b.y)==0; } 32 33 double Dot(Vector A,Vector B) {return A.x*B.x + A.y*B.y ; } 34 double Length(Vector A,Vector B) {return sqrt(Dot(A,A)); } 35 double cross(Vector A,Vector B) {return A.x*B.y - B.x*A.y; } 36 37 double dist(Point A,Point B) 38 { 39 double xx=(A.x-B.x)*(A.x-B.x); 40 double yy=(A.y-B.y)*(A.y-B.y); 41 return sqrt(xx+yy); 42 } 43 44 Point cur; 45 double rotating_calipers(Point *ch,int n) 46 { 47 int q=1; 48 double ans=-1; 49 cur.x=cur.y=0; 50 ch[n]=ch[0]; 51 for (int p=0 ;p<n ;p++) 52 { 53 while (cross(ch[q+1]-ch[p+1],ch[p]-ch[p+1])>cross(ch[q]-ch[p+1],ch[p]-ch[p+1])) 54 q=(q+1)%n; 55 double len=dist(ch[p],ch[q]); 56 double len2=dist(ch[p+1],ch[q+1]); 57 if (len>ans+exp) 58 { 59 ans=len; 60 cur.x=(ch[p].x+ch[q].x)/2.0; 61 cur.y=(ch[p].y+ch[q].y)/2.0; 62 } 63 if (len2>ans+exp) 64 { 65 ans=len2; 66 cur.x=(ch[p+1].x+ch[q+1].x)/2.0; 67 cur.y=(ch[p+1].y+ch[q+1].y)/2.0; 68 } 69 } 70 return ans; 71 } 72 73 int Convexhull(Point *p,int n,Point *ch) 74 { 75 sort(p,p+n); 76 int m=0; 77 for (int i=0 ;i<n ;i++) 78 { 79 while (m>1 && dcmp(cross(ch[m-1]-ch[m-2],p[i]-ch[m-2]))<0) m--; 80 ch[m++]=p[i]; 81 } 82 int k=m; 83 for (int i=n-2 ;i>=0 ;i--) 84 { 85 while (m>k && dcmp(cross(ch[m-1]-ch[m-2],p[i]-ch[m-2]))<0) m--; 86 ch[m++]=p[i]; 87 } 88 if (n>1) m--; 89 return m; 90 } 91 92 int main() 93 { 94 while (scanf("%d",&n)!=EOF && n) 95 { 96 for (int i=0 ;i<n ;i++) scanf("%lf%lf",&an[i].x,&an[i].y); 97 if (n==1) {printf("%.2lf %.2lf 0.00\n",an[0].x,an[0].y);continue; } 98 if (n==2) {printf("%.2lf %.2lf %.2lf\n",(an[0].x+an[1].x)/2.0, 99 (an[0].y+an[1].y)/2.0,dist(an[0],an[1])/2.0);continue; } 100 int m=Convexhull(an,n,bn); 101 double ans=rotating_calipers(bn,m); 102 printf("%.2lf %.2lf %.2lf\n",cur.x,cur.y,ans/2.0); 103 } 104 return 0; 105 }
标签:
原文地址:http://www.cnblogs.com/huangxf/p/4373994.html