HDU

#include<stdio.h>
#include<math.h>
const double eps = 1e-8;
const double pi = acos(-1.0);
struct Point
{
    double x,y;
};
struct circle
{
    Point pp;
    double r;
}cir[30];
double area[30];
int n;
double cir_area_inst(Point c1,double r1,Point c2,double r2)
{  //两圆面积交
    double a1, a2, d, ret;
    d = sqrt((c1.x-c2.x)*(c1.x-c2.x)+(c1.y-c2.y)*(c1.y-c2.y));
    //圆心距离
    if ( d > r1 + r2 - eps )
        return 0;            //相离
    if ( d < r2 - r1 + eps )
        return pi*r1*r1;   //内切与包含
    if ( d < r1 - r2 + eps )
        return pi*r2*r2;   //内切与包含
    a1 = acos((r1*r1+d*d-r2*r2)/2/d/r1);//相交
    //余弦定理求角
    a2 = acos((r2*r2+d*d-r1*r1)/2/d/r2);
    ret = (a1-0.5*sin(2*a1))*r1*r1 + (a2-0.5*sin(2*a2))*r2*r2;
    //求楔形(扇形减三角形)面积
    return ret;

}
bool judge(Point p,double r)//枚举每个圆心
{
    int i,j;
    for(i=0;i<n;i++)
    {
        double Are = cir_area_inst(p,r,cir[i].pp,cir[i].r);
        if(Are<area[i])return false;
    }
    return true;
}
int main()
{
    int t,i,j;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(i=0;i<n;i++)
        {
            scanf("%lf %lf %lf",&cir[i].pp.x,&cir[i].pp.y,&cir[i].r);
            area[i] = pi*cir[i].r*cir[i].r/2;
        }
        Point a;
    double rans = 200000;  //初始化符合要求的大圆半径
    for(i=0;i<n;i++)
    {
        a = cir[i].pp;
        double l=0,r=200000,mid;
        while(fabs(l-r)>eps)//二分法
        {
            mid = (l+r)/2;
            if(judge(a,mid))
            {
                r =mid;
                if(mid<rans)//找符合要求的最小的圆
                rans =mid;
            }
            else l=mid;
        }
    }
    printf("%.4lf
",rans);
    }
    return 0;
}

  

from:http://www.cnblogs.com/XDJjy/archive/2013/04/02/2995918.html

原文地址:https://www.cnblogs.com/NWUACM/p/6406486.html