浮点数二分while条件为l<r
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const double eps=1e-6;
const double PI=acos(-1.0);
struct Circle{
double x,y;
double r;
};
double calArea(Circle c1, Circle c2)
{
double d;
double s,s1,s2,s3,angle1,angle2;
d=sqrt((c1.x-c2.x)*(c1.x-c2.x)+(c1.y-c2.y)*(c1.y-c2.y));
if(d>=(c1.r+c2.r))//两圆相离
return 0;
if((c1.r-c2.r)>=d)//两圆内含,c1大
return PI*c2.r*c2.r;
if((c2.r-c1.r)>=d)//两圆内含,c2大
return PI*c1.r*c1.r;
angle1=acos((c1.r*c1.r+d*d-c2.r*c2.r)/(2*c1.r*d));
angle2=acos((c2.r*c2.r+d*d-c1.r*c1.r)/(2*c2.r*d));
s1=angle1*c1.r*c1.r;s2=angle2*c2.r*c2.r;
s3=c1.r*d*sin(angle1);
s=s1+s2-s3;
return s;
}
bool isZero(double x){
return x>-eps&&x<eps;
}
int main()
{
double x1,y1,x2,y2,r;
int t;
scanf("%d",&t);
while(t--)
{
scanf("%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&r);
Circle c1=Circle{x1,y1,r};
double ans=(PI*r*r)/2;
double d=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
double L=0.0,R=d+r;
double rr=0;
while(L<R)
{
double mid=(L+R)/2;
double area=calArea(c1,Circle{x2,y2,mid});
if(isZero(area-ans)) {rr=mid;break;}
else if(ans>area+eps) L=mid;
else R=mid;
}
printf("%.4f\n",rr);
}
return 0;
}