期望得分:20+100+100=220
实际得分:20+100+100=220
特判相离、内含
对于两圆相交的情况,一直在考虑求交点
实际上相交的面积可以用两个扇形减去两个三角形
正弦定理、余弦定理来搞搞
#include<cmath> #include<cstdio> #include<algorithm> using namespace std; const double pi=acos(-1.0); const double eps=1e-6; double Two_point_dis(double x1,double yy1,double x2,double yy2) { return sqrt((x1-x2)*(x1-x2)+(yy1-yy2)*(yy1-yy2)); } double circle_S(double r) { return pi*r*r; } int main() { freopen("standing.in","r",stdin); freopen("standing.ans","w",stdout); int T; scanf("%d",&T); double x1,yy1,r1,x2,yy2,r2; while(T--) { scanf("%lf%lf%lf%lf%lf%lf",&x1,&yy1,&r1,&x2,&yy2,&r2); double dis=Two_point_dis(x1,yy1,x2,yy2); if(dis>=r1+r2) { printf("%.3lf\n",circle_S(r1)+circle_S(r2)); continue; } if(dis<=fabs(r1-r2)) { printf("%.3lf\n",max(circle_S(r1),circle_S(r2))); continue; } else { double ans=circle_S(r1)+circle_S(r2); double j1=acos((r1*r1+dis*dis-r2*r2)/(2*r1*dis)); double l1=j1*2*r1; double j2=acos((r2*r2+dis*dis-r1*r1)/(2*r2*dis)); double l2=j2*2*r2; double s1=l1*r1*0.5; double s2=l2*r2*0.5; double s=r1*dis*sin(j1); ans-=(s1+s2-s); printf("%.3lf\n",ans); } } }