F - Girlfriend
纯数学,求两个球的体积并,公式略(不懂怎么插入公式qwq)
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<queue> #include<algorithm> using namespace std; const double pi=acos(-1); int T; double x[9],y[9],z[9]; double k1,k2; double dist(double x1,double y1,double z1,double x2,double y2,double z2) { return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(z1-z2)*(z1-z2)); } double qzb(double x,double y,double z) { return (z*z*x-y)/(z*z-1); } double CV(double r) { return 4*pi*r*r*r/3; } int main(){ cin>>T; while(T--) { for(int i=1;i<=4;i++) { cin>>x[i]>>y[i]>>z[i]; } cin>>k1>>k2; double num1=k1*k1-1; double num2=k2*k2-1; double qx1,qx2,qy1,qy2,qz1,qz2,r1,r2; qx1=qzb(x[2],x[1],k1); qy1=qzb(y[2],y[1],k1); qz1=qzb(z[2],z[1],k1); r1=k1*k1*(x[2]*x[2]+y[2]*y[2]+z[2]*z[2])-(x[1]*x[1]+y[1]*y[1]+z[1]*z[1]); r1/=num1; r1=sqrt(qx1*qx1+qy1*qy1+qz1*qz1-r1); qx2=qzb(x[4],x[3],k2); qy2=qzb(y[4],y[3],k2); qz2=qzb(z[4],z[3],k2); r2=k2*k2*(x[4]*x[4]+y[4]*y[4]+z[4]*z[4])-(x[3]*x[3]+y[3]*y[3]+z[3]*z[3]); r2/=num2; r2=sqrt(qx2*qx2+qy2*qy2+qz2*qz2-r2); double dis=dist(qx1,qy1,qz1,qx2,qy2,qz2); //cout<<dis<<r1<<r2; double V=0; if(dis>=r1+r2)V=0; else if((dis+r1)<=r2) { V=(4.00/3.00)*pi*r1*r1*r1; } else if((dis+r2)<=r1) { V=(4.00/3.00)*pi*r2*r2*r2; } else{ double cal=(r1*r1+dis*dis-r2*r2)/(2.00*dis*r1); double h=r1*(1-cal); V+=pi*(3.00*r1-h)*h*h/3.00; cal=(r2*r2+dis*dis-r1*r1)/(2*dis*r2); h=r2*(1-cal); V+=pi*(3.00*r2-h)*h*h/3.00; } printf("%.3lf\n",V); } return 0; }

浙公网安备 33010602011771号