본문 바로가기
Algorithms/simulation

1245 균형점

by OKOK 2018. 10. 26.

균형점

 

무중력 공간 n개의 자성체들이 존재.

자성체들의 중심점이 자성체의 위치. 공간 좌표.

n개의 자성체들의 y와 z 좌표 모두 동일하고 x좌표만 다르다.

- 자성체 물체 작용하는 인력 공식 양의 상수 값

- 물체의 왼쪽에 있는 자성체들의 인력. 

- n개의 자성체가 있다면 n-1 개의 균형점이 존재

- 좌표값의 오차가 1e-12 보다 작아야 함

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h> // 헤더파알
#define E 1e-9 // 오차 범위 설정
int n, m; 
int a[99]; // 자성체 위치 배열
int b[99]; // 자성체 무게 배열
bool less(double x) {
    int i, j, k;
    double sum = 0;
    double cur;
    for (i = 0; i < m; i++) {
        cur = (x - a[i]); // mid 값에서 처음 자성체 무게 뺌
        cur *= cur; // 현재 무게 곱 현재 무게
        if (cur < E) return false; // 확인
        cur = b[i] / cur; // 현재 무게 = 거리로 나눔
        sum += cur; //
    }
    for (i = m; i < n; i++) {
        cur = (x - a[i]);
        cur *= cur;
        if (cur < E) return true;
        cur = b[i] / cur;
        sum -= cur;
    }
    return sum < 0;
}
int main() {

    freopen("input.txt", "r", stdin);
    int t, tv = 0; 
    int i, j, k, l;
    scanf("%d", &t); // 테케 숫자
    while (t--) {
        scanf("%d", &n); // 자성체 숫자
        for (i = 0; i < n; i++)scanf("%d", &a[i]); // 자성체 위치
        for (i = 0; i < n; i++)scanf("%d", &b[i]); // 자성체 무게
        printf("#%d", ++tv);
        for (m = 1; m < n; m++) {
            double l, r, mid;
            l = a[m - 1]; // 무게 관련 변수 
            r = a[m]; // 무게 관련 변수
            int cnt = 100;
            while (cnt--) {
                mid = (l + r) / 2; // 중심 무게
                if (less(mid)) 
                    r = mid;
                else
                    l = mid;
            }
            printf(" %.10lf", l);
        }
        printf("\n");
    }
}

'Algorithms > simulation' 카테고리의 다른 글

1248 공통조상  (0) 2018.10.26
1244 최대 상금  (0) 2018.10.26
1240 단순 2진 암호코드  (0) 2018.10.26
1228 암호문1  (0) 2018.10.26
1225 암호생성기  (0) 2018.10.26

댓글