D2 Cosmic Cleaner

为什么大家都知道球缺怎么求,我没听说过啊???

我真的是印象里今天第一次听说球缺这个东西啊。。。

我一看,哇,神仙几何题,毫无头绪,投了投了,然后就被过穿了???

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

猜你喜欢

转载自www.cnblogs.com/MXang/p/10301377.html
d2