链接: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();
}
}