※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 24957번 문제인 Loop of Chocolate이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/24957 

 

24957번: Loop of Chocolate

Output in a line the volume of the union of the spheres. Relative error of the output should be within $10^{-7}$.

www.acmicpc.net

주어지는 영역의 부피는 (구 n개의 부피) - (n개의 겹치는 영역의 넓이)로 계산할 수 있다.

 

구의 부피 공식과 두 구의 겹치는 영역의 부피를 주어진 공식을 이용해 계산하고 문제를 해결하자. 두 점 사이의 거리 d는 sqrt(각 좌표의 차의 제곱의 합)으로 구할 수 있다.

 

처음으로 주어지는 구와 마지막으로 주어지는 구 사이에 겹치는 영역의 부피 또한 고려해야 함에 유의하자.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <cmath>
using namespace std;
typedef long double ld;

ld PI = acos(-1);

int N, R;
int X[101], Y[101], Z[101];
ld ans1 = 0, ans2 = 0;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cout << fixed;
	cout.precision(10);

	cin >> N >> R;
	for (int i = 0; i < N; i++) {
		cin >> X[i] >> Y[i] >> Z[i];
	}
	X[N] = X[0], Y[N] = Y[0], Z[N] = Z[0];
	
	ans1 = (ld)4 / 3 * PI * R * R * R * N;
	
	for (int i = 1; i <= N; i++) {
		int d = (X[i] - X[i - 1]) * (X[i] - X[i - 1]) + (Y[i] - Y[i - 1]) * (Y[i] - Y[i - 1]) + (Z[i] - Z[i - 1]) * (Z[i] - Z[i - 1]);
		ld d2 = (ld)sqrt(d) / 2;
		ans2 += (ld)2 / 3 * PI * ((ld)R - d2) * ((ld)R - d2) * ((ld)2 * R + d2);
	}

	cout << ans1 - ans2;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 25965 // C++] 미션 도네이션  (0) 2022.11.14
[BOJ 2309 // C++] 일곱 난쟁이  (0) 2022.11.13
[BOJ 7581 // C++] Cuboids  (0) 2022.11.13
[BOJ 25773 // C++] Number Maximization  (0) 2022.11.13
[BOJ 7582 // C++] On the Bus  (0) 2022.11.13

+ Recent posts