期望得分:20+100+100=220

实际得分:20+100+100=220

NOIP模拟4

特判相离、内含

对于两圆相交的情况,一直在考虑求交点

实际上相交的面积可以用两个扇形减去两个三角形

正弦定理、余弦定理来搞搞

NOIP模拟4

#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);
        }
    }
}
View Code

相关文章: