题目链接: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;
}