zoj 3716
题目给我们四个点,要求我们以这四个点为圆心,形成四个相切的圆;
求他们的半径和;
首先我们从他们中间选出三个点,以这三个点为圆心的三个圆最大可以两两互相相切;
证明:假设这三个圆的半径分别为a,b,c,那么形成的三条边分别长为:a+b,a+c,b+c,他们两两之和大于第三边;
然后从第四个点出发的圆必定和前面三个的一个或多个相切;
所以这个问题就转化成为三对边和的比较;
代码:
1 #include<cstdio> 2 #include<cmath> 3 #include<algorithm> 4 using namespace std; 5 double dis(double x1,double y1,double x2,double y2) 6 { 7 return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); 8 } 9 int main() 10 { 11 double x[4],y[4]; 12 while(scanf("%lf%lf",&x[0],&y[0])!=EOF) 13 { 14 for(int i=1;i<4;i++) 15 scanf("%lf%lf",&x[i],&y[i]); 16 double d1=dis(x[0],y[0],x[1],y[1]); 17 double d2=dis(x[1],y[1],x[2],y[2]); 18 double d3=dis(x[2],y[2],x[3],y[3]); 19 double d4=dis(x[3],y[3],x[0],y[0]); 20 double d5=dis(x[3],y[3],x[1],y[1]); 21 double d6=dis(x[0],y[0],x[2],y[2]); 22 printf("%lf\n",min(d1+d3,min(d2+d4,d5+d6))); 23 } 24 return 0; 25 }