※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 24957번 문제인 Loop of Chocolate이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/24957
주어지는 영역의 부피는 (구 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 |