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