본문 바로가기

알고리즘/BOJ

[C++]11930-Smallest Enclosing Sphere

www.acmicpc.net/problem/11930  문제링크다.

 

11930번: Smallest Enclosing Sphere

첫째 줄에는 하나의 양의 정수 N이 주어진다. (1 ≤ N ≤ 1,000) 둘째 줄부터 N개의 줄에 걸쳐 각 점의 좌표를 나타내는 3개의 정수 x, y, z가 주어진다. x, y, z는 -1,000,000보다 크거나 같고 1,000,000보다

www.acmicpc.net

밑에는 비슷한 문제들이다.

www.acmicpc.net/problem/2626

 

2626번: 헬기착륙장

문제를 간단히 하기 위해서 섬의 크기는 무시하고, 섬의 위치를 2차원 정수 좌표로 표시한다. 첫 줄은 섬의 개수를 나타내는 정수 N(2≤N≤1,000)이다. 그 다음 N개의 줄은 각 줄마다 섬의 x 좌표값,

www.acmicpc.net

www.acmicpc.net/problem/13708

 

13708번: 모든 점을 포함하는 원

첫째 줄에 점 N (2 ≤ N ≤ 300)이 주어진다. 둘째 줄부터 N개의 줄에 점의 좌표 x, y가 주어진다. (0 ≤ x, y ≤ 1,000)

www.acmicpc.net

www.acmicpc.net/problem/2389  

 

2389번: 세상의 중심에서...

첫째 줄에 N(1≤N≤100)이 주어진다. 다음 N개의 줄에는 x, y 좌표가 주어진다. 각각의 좌표는 소수점 여섯째자리까지 주어지며, -600,000 ≤ x, y ≤ 600,000을 만족한다.

www.acmicpc.net

저 문제하나 풀줄알면 밑에 세개는 꽁으로 경험치 먹을 수 있다.

뭐, 보통은 저기 3개중에 하나로 입문하겠지만. 나도 2389번으로 입문했고.

2389번 포스팅 https://ssuallassualla.tistory.com/155

 

2389랑 다를게 없다. z생긴거랑, 출력바뀐거 빼면.

 

2389는 볼록껍질을 사용해서 조금 시간을 줄였는데, c++에서 볼록껍질 해본적도 없고, 만들기 귀찮아서 그냥 했다.

#include <cstdio>
#include <math.h>
#include <utility>

#define ROUNDING(x, dig)	( floor((x) * pow(float(10), dig) + 0.5f) / pow(float(10), dig) )
int n;
double dots[1001][3];
double getDistanceDoubled(double p1[], double p2[]) {
    return (p1[0]-p2[0])*(p1[0]-p2[0]) + (p1[1]-p2[1])*(p1[1]-p2[1]) + (p1[2]-p2[2])*(p1[2]-p2[2]);
}
int main(){
    scanf("%d",&n);
    double x, y, z;
    for(int i=0;i<n;i++){
        scanf("%lf %lf %lf", &x, &y, &z);
        dots[i][0] = x;
        dots[i][1] = y;
        dots[i][2] = z;
    }
    x = 0;
    y = 0;
    z = 0;
    for(int i=0;i<n;i++){
        x += dots[i][0];
        y += dots[i][1];
        z += dots[i][2];
    }
    x /= (double)n;
    y /= (double)n;
    z /= (double)n;
    double ratio = 0.1;
    double maxVal, tmp;
    for(int i = 0; i < 20000; i++) {
        double point[3] = {x,y,z};
        maxVal = 0;
        int maxIn = 0;
        for(int j = 0; j < n; j++) {
            tmp = getDistanceDoubled(point, dots[j]);
            if(tmp > maxVal) {
                maxVal = tmp;
                maxIn = j;
            }
        }
        x += (dots[maxIn][0] - x)*ratio;
        y += (dots[maxIn][1] - y)*ratio;
        z += (dots[maxIn][2] - z)*ratio;
        ratio *= 0.995;
    }
    printf("%.2lf", ROUNDING(sqrt(maxVal),2));
}

밑에 틀린 것은, ratio *= 0.995 말고 0.999를 해서 틀렸다. 매개변수 적당히 잘 찍는 것도 중요한 것 같다.

'알고리즘 > BOJ' 카테고리의 다른 글

13705-Ax+Bsin(x)=C  (0) 2020.12.25
[Python]7420-맹독 방벽  (0) 2020.09.25
[Python]10254-고속도로  (2) 2020.09.12
[Python]4181-Convex Hull  (0) 2020.09.12
[Python]2389-세상의 중심에서...  (0) 2020.09.12
[Python]16489-삼각형 해커  (0) 2020.09.10
[Python]1194-달이 차오른다, 가자.  (0) 2020.08.10
[Python&C++]7868-해밍 수열  (0) 2020.07.11