题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2559

解题报告:比赛的时候的想法是可以确定至少有两对相切的圆,所以我的做法是枚举其中的两对圆相切,还好,这样只要枚举3次就够 了,然后设其中一个圆的半径为x,然后其他的两个圆的半径就知道了,然后另外一条边的边长减去这条边上的两个圆的半径等于0就可以得出x也就求出了三条边的大小,然后求出这三种情况下的半径的总和是多少,输出最大的那种情况下的三个半径的长度就是了。还要注意的是输出的顺序,要按照输入的顺序输出。

 #include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm> double dis(double x1,double y1,double x2,double y2)
{
return std::sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
} int main()
{
double x1,y1,x2,y2,x3,y3,a,b,c; while(scanf("%lf%lf",&x1,&y1)!=EOF)
{
scanf("%lf%lf%lf%lf",&x2,&y2,&x3,&y3);
a = dis(x1,y1,x2,y2);
b = dis(x1,y1,x3,y3);
c = dis(x2,y2,x3,y3);
double tot[],X1,X2,X3;
X1 = (b + c - a) / 2.0;
X2 = (a + c - b) / 2.0;
X3 = (a + b - c) / 2.0;
tot[] = b + c - X1;
tot[] = a + c - X2;
tot[] = a + b - X3;
if(tot[] >= tot[] && tot[] >= tot[])
printf("%.6lf\n%.6lf\n%.6lf\n",b - X1,c - X1,X1);
else if(tot[] >= tot[] && tot[] >= tot[])
printf("%.6lf\n%.6lf\n%.6lf\n",a - X2,X2,c - X2);
else printf("%.6lf\n%.6lf\n%.6lf\n",X3,a - X3,b - X3);
}
return ;
}
05-11 14:05