균형점
무중력 공간 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 |
댓글