为什么大家都知道球缺怎么求,我没听说过啊???
我真的是印象里今天第一次听说球缺这个东西啊。。。
我一看,哇,神仙几何题,毫无头绪,投了投了,然后就被过穿了???
tlsnb!!!
知道了公式以后求一求就阔以了
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define pi 3.1415926535 int t,n,x[105],y[105],z[105],r[105]; int xx,yy,zz,rr; double dis(int id){ return sqrt((x[id]-xx)*(x[id]-xx)+(y[id]-yy)*(y[id]-yy)+(z[id]-zz)*(z[id]-zz)); } int main(){ ios::sync_with_stdio(false); cin>>t; for(int cas=1;cas<=t;cas++){ cin>>n; for(int i=1;i<=n;i++){ cin>>x[i]>>y[i]>>z[i]>>r[i]; } cin>>xx>>yy>>zz>>rr; double ans = 0; for(int i=1;i<=n;i++){ double len = dis(i); if(len+r[i]<=rr){//在内部 ans+=4.0/3*pi*r[i]*r[i]*r[i]; } else if(len+r[i]>rr&&len<rr){//一大块在里面 double h1 = (rr*rr-r[i]*r[i]-len*len)/2/len; double h2 = h1+len; double v1 = pi/3*(3*r[i]-(r[i]-h1))*(r[i]-h1)*(r[i]-h1);//小的 double v2 = pi/3*(3*rr-(rr-h2))*(rr-h2)*(rr-h2);//大的 ans+=4.0/3*pi*r[i]*r[i]*r[i]; ans-=v1;ans+=v2; } else if(len>=rr&&len<=rr+r[i]){ double k = rr+r[i]-len; double h2 = (k*k-2*k*r[i])/(2*k-2*rr-2*r[i]); double h1 = k-h2; double v1 = pi/3*(3*r[i]-h1)*h1*h1;//小的 double v2 = pi/3*(3*rr-h2)*(h2)*(h2);//大的 ans+=v1+v2; } } printf("Case #%d: %.10f\n",cas,ans); } }