牛客练习赛41 E 球并的体积【几何】

题目链接:https://ac.nowcoder.com/acm/contest/373/B


了解几个公式,顺便自己记一下:

球的体积:v=4/3*r*r*r*PI;
球表面积:v=4*r*r*PI;

球冠:球被平面截下较小的一部分;
球冠表面积:S=2*PI*r*h  (r是球的半径,h是球冠的高,即垂直于截面的直径被截后被截下的线段长)
球冠的体积:V=PI/3*h*h*(3*r-h);

余弦公式

                     

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<math.h>
#include<map>
#include<set>
#include<queue>
#include<vector>
#include<stack>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const double pi=acos(-1.0);
const ll mod=1e9+7;
const int N=1e5+10;

double cal(double r)
{
    return r*r*r*pi*(4/3.0);
}

double cal_jiao(double r1,double l,double r2)
{
    return (r1*r1+l*l-r2*r2)/(2*r1*l);
}

double cal_que(double r,double h)
{
    return pi/3*h*h*(3*r-h);
}

int main()
{
    double x1,x2,y1,y2,r1,r2,z1,z2;
    while(~scanf("%lf %lf %lf %lf %lf %lf %lf %lf",&x1,&y1,&z1,&r1,&x2,&y2,&z2,&r2))
    {
        double l=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)+(z2-z1)*(z2-z1));
        double ans=0;
        if(l>=r1+r2)
        {
            ans=cal(r1)+cal(r2);
        }
        else if(r1+l<=r2||r2+l<=r1)
        {
            ans=cal(max(r1,r2));
        }
        else
        {
            double jiao1=cal_jiao(r1,l,r2);
            double jiao2=cal_jiao(r2,l,r1);
            double h1=r1-r1*jiao1,h2=r2-r2*jiao2;
            ans=cal(r1)+cal(r2)-cal_que(r1,h1)-cal_que(r2,h2);
        }
        printf("%.7lf\n",ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41984014/article/details/88073991