球的体积并

链接:https://ac.nowcoder.com/acm/contest/373/E
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
Special Judge, 64bit IO Format: %lld
题目描述
某天lililalala正在玩一种奇妙的吃鸡游戏–因为在这个游戏里会同时有两个圆形安全区(他们可能相交)。
lililalala觉得求圆的面积并太简单了,所以想把这个问题升级一下。
现在在三维空间里有 2 个球形安全区,分别用四元组

<
x
1
,
y
1
,
z
1
,
r
1

<x1,y1,z1,r1> 和

<
x
2
,
y
2
,
z
2
,
r
2

<x2,y2,z2,r2>表示,其中

r
1

r
2
r1、r2表示球半径,

(
x
1
,
y
1
,
z
1
)
(x1,y1,z1)和

(
x
2
,
y
2
,
z
2
)
(x2,y2,z2)表示球心
lililalala想知道安全区的总体积是多少?即求这两个球的体积并。

输入描述:
输入有两行。
第一行四个实数

x
1
,
y
1
,
z
1
,
r
1
x1,y1,z1,r1–第一个球的球心座标和半径。
第二行四个实数

x
2
,
y
2
,
z
2
,
r
2
x2,y2,z2,r2–第二个球的球心座标和半径。
保证所有输入的座标和半径的范围都在

[

100
,
100
]
[−100,100] 内。

输出描述:
输出一行一个实数–表示两个球的体积并,你的答案被认为正确,当且仅当绝对误差不超过

10

6
10−6。
示例1
输入
复制
0 0 0 1
2 0 0 1
输出
复制
8.3775804
示例2
输入
复制
0 0 0 1
0 0 0 0.5
输出
复制
4.1887902

思路:当时被并查集那题搞疯了,没空看这题,现在看来这题其实更容易搞,只是求球体的体积并公式要记住才行。

公式我也是看这里的:https://blog.csdn.net/luyehao1/article/details/86583384

import java.util.Scanner;
import java.io.BufferedInputStream;
public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(new BufferedInputStream(System.in));
        double v=0;
        double x1=sc.nextDouble();
        double y1=sc.nextDouble();
        double z1=sc.nextDouble();
        double r1=sc.nextDouble();
        double x2=sc.nextDouble();
        double y2=sc.nextDouble();
        double z2=sc.nextDouble();
        double r2=sc.nextDouble();
        double max=r1>=r2?r1:r2;
        double min=r1<=r2?r1:r2;
        double d=Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(z1-z2)*(z1-z2));
        if(d>=r1+r2)
            v=4/3.0*Math.PI*r1*r1*r1+4/3.0*Math.PI*r2*r2*r2;
        else
            if((d+min)<=max)
                v=v=4/3.0*Math.PI*max*max*max;
        else
            if((max-min)<d&&d<(max+min)) {
                double a=(max*max+d*d-min*min)/(2*max*d);
                double b=(min*min+d*d-max*max)/(2*min*d);
                double h1=max*(1-a);
                double h2=min*(1-b);
                v=4/3.0*Math.PI*r1*r1*r1+4/3.0*Math.PI*r2*r2*r2-(Math.PI/3.0*(3*max-h1)*h1*h1+Math.PI/3.0*(3*min-h2)*h2*h2);
            }
        System.out.printf("%.7f\n",v);
        sc.close();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章