IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 2021牛客暑期多校训练营2 F Girlfriend -> 正文阅读

[数据结构与算法]2021牛客暑期多校训练营2 F Girlfriend

题目链接2021牛客暑期多校训练营2 F Girlfriend

数学题
意思就是求两个球相交部分的体积
上代码

#include <bits/stdc++.h>
using namespace std;

const double PI = acos(-1);

//坐标
struct pos
{
    double x,y,z;
};
//输入数据
int T;
pos p[5];
double k1,k2;

//由两球球心和半径得到其相交部分体积
void calc(pos o1,pos o2,double r1,double r2)
{
    double ans=0.0;
    double dis=sqrt((o1.x-o2.x)*(o1.x-o2.x)+(o1.y-o2.y)*(o1.y-o2.y)+(o1.z-o2.z)*(o1.z-o2.z));

    //不相交
    if(dis>=r1+r2)
        ans=0;
    //内含
    else if (dis+r1<=r2)
        ans=(4.00/3.00)*PI*r1*r1*r1;
    else if(dis+r2<=r1)
        ans=(4.00/3.00)*PI*r2*r2*r2;
    else
    {
    	//余弦定理
        double cos_r1_dis=(r1*r1+dis*dis-r2*r2)/(2.0*dis*r1);
		//计算球缺的高度
        double h1=r1-r1*cos_r1_dis;
		//球缺体积计算公式
        ans+=PI*h1*h1*(r1-h1/3.0);
        
		//余弦定理
        double cos_r2_dis=(r2*r2+dis*dis-r1*r1)/(2.0*dis*r2);
		//计算球缺的高度
        double h2=r2-r2*cos_r2_dis;
		//球缺体积计算公式
        ans+=(PI*h2*h2*(r2-h2/3.0));
    }
    printf("%.3f\n",ans);
}

int main()
{
    cin>>T;
    while(T--)
    {
        for(int i = 0; i < 4; i++)
            cin >> p[i].x >> p[i].y >> p[i].z;

        cin>>k1>>k2;
        double tmp1=k1*k1-1,tmp2=k2*k2-1;
		
        pos O1,O2;
        double r1,r2,D1,D2;

        //球1
        O1.x=(k1*k1*p[1].x-p[0].x)/tmp1;
        O1.y=(k1*k1*p[1].y-p[0].y)/tmp1;
        O1.z=(k1*k1*p[1].z-p[0].z)/tmp1;


        D1=k1*k1*(p[1].x*p[1].x+p[1].y*p[1].y+p[1].z*p[1].z)-p[0].x*p[0].x-p[0].y*p[0].y-p[0].z*p[0].z;
        D1/=tmp1;

        r1=sqrt(O1.x*O1.x+O1.y*O1.y+O1.z*O1.z-D1);

        //球2
        O2.x=(k2*k2*p[3].x-p[2].x)/tmp2;
        O2.y=(k2*k2*p[3].y-p[2].y)/tmp2;
        O2.z=(k2*k2*p[3].z-p[2].z)/tmp2;


        D2=k2*k2*(p[3].x*p[3].x+p[3].y*p[3].y+p[3].z*p[3].z)-p[2].x*p[2].x-p[2].y*p[2].y-p[2].z*p[2].z;
        D2/=tmp2;

        r2=sqrt(O2.x*O2.x+O2.y*O2.y+O2.z*O2.z-D2);
        //printf("o1: %lf %lf %lf r1= %lf\n",O1.x,O1.y,O1.z,r1);
        //printf("o2: %lf %lf %lf r2= %lf\n",O2.x,O2.y,O2.z,r2);
        calc(O1,O2,r1,r2);
    }
    return 0;
}

对题目抽象可得这样两个方程

( k12 - 1 ) ( x2 + y2 + z2 ) - ( 2 k12x1 - 2 x0)x - ( 2 k12y1 - 2 y0)y - ( 2 k12z1 - 2 z0)z + k12( x12 + y12 + z12 ) - ( x02 + y02 + z02 ) <= 0

( k22 - 1 ) ( x2 + y2 + z2 ) - ( 2 k22x3 - 2 x2)x - ( 2 k22y3 - 2 y2)y - ( 2 k22z3 - 2 z2)z + k22( x32 + y32 + z32 ) - ( x22 + y22 + z22 ) <= 0

也就是球的一般方程
x2 + y2 + z2 + Ax + By + Cz + D = 0
球的圆心为(-A/2, -B/2, -C/2)
r2为(A2+B2+C2-4D)/4

余弦定理公式来源百度百科
百度百科链接
在这里插入图片描述

球缺体积公式来源百度百科
百度百科链接
球缺体积公式

参考了大佬的题解
感谢这位大佬
ta的牛客题解

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-23 11:03:36  更:2021-07-23 11:04:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 16:50:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码