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
",min(d1+d3,min(d2+d4,d5+d6)));
23     }
24     return 0;
25 }
View Code
原文地址:https://www.cnblogs.com/yours1103/p/3418399.html