球的表面积(数论题)

31 篇文章 1 订阅

牛客小白月赛20 C 球的表面积

题目链接
在这里插入图片描述

算法分析

这题是个纯数论题,首先我们知道外离和内含的状态是好求的,
难点在相交,相交需要减去两个互相融入的部分,以相交面为切面
那么第一个球融入第二个球的部分就是球冠.球冠是指一个球面被平面所
截后剩下的曲面。截得的圆面是底,垂直于圆面的直径被截得的部分是高。
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

然后还需要知道球冠的表面积怎么求是2* π * r1 * h1
h1等于r1*(1-cos∠1);角公式2abcos∠1=a* a+ b* b-c* c
c为∠1对的边.所以就是cos∠1=(r1* r1+dis * dis-r2 * r2) / (2.0 * r1 *dis);

#include<iostream>
#include<math.h>
#include<algorithm>
#include<cstring>
using namespace std;
#define PI acos(-1)
typedef long long ll;
typedef double d;
int main()
{
    d x1,x2,y1,y2,z1,z2,r1,r2;
    cin>>x1>>y1>>z1>>r1>>x2>>y2>>z2>>r2;
    d v1=4*PI*r1*r1;
    d v2=4*PI*r2*r2;
    d dis=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(z1-z2)*(z1-z2));
    if(dis>=r1+r2)
        printf("%lf\n",v1+v2);
    else if(dis<=r1+r2&&dis<=max(r1,r2)-min(r1,r2))
        printf("%lf\n",max(v1,v2));
    else
    {
        d cos1=(r1*r1+dis*dis-r2*r2)/(2.0*r1*dis);
        d h1=r1*(1-cos1);
        d v11=2*PI*r1*h1;
        d cos2=(r2*r2+dis*dis-r1*r1)/(2.0*r2*dis);
        d h2=r2*(1-cos2);
        d v22=2*PI*r2*h2;
        d ans=v1+v2-v11-v22;
        printf("%lf\n",ans);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值