球的體積並

鏈接: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();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章