개인적인 풀이이니 참고만 하시길 바랍니다.
건설적인 비판과 의견은 대환영입니다 :)
문제
[S/W 문제해결 응용] 2일차 - 균형점
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV15MeBKAOgCFAYD
위 문제는 이분탐색을 이용해서 각 구간별 양쪽 인력 계산값이 0이 되는 점을 찾았다. 계산식에서 균형점의 무게와 G값은 무시해도 되는것을 알 수 있다.
이번에도 역시나 무식한 나의 머리때문에 몸이 고생했는데, 모든 자성체 사이의 모든 균형점을 다 찾아야하는데, 나란 인간은 한개의 선에서 하나의 균형점만 찾고있었다.(문제쫌 끝까지 자세히 읽자 ㅠ)
그리고 문제를 해결하면서 부동소수점 계산 관련 아주 좋은 링크를 찾았다 !
https://www.acmicpc.net/blog/view/37
코드
#include<iostream>
using namespace std;
typedef pair<double, double> P;
int main(int argc, char** argv)
{
int test_case;
int T;
cin>>T;
for(test_case = 1; test_case <= T; ++test_case)
{
cout << "#" << test_case << " ";
int N;
double t_min, t_max;
P circles[10];
cin >> N;
for (int i = 0; i < N ; i++) {
cin >> circles[i].first;
}
for (int i = 0; i < N ; i++) {
cin >> circles[i].second;
}
for (int i = 0; i < N-1; i++) {
for (int j = i+1; j < N; j++) {
if (circles[i].first > circles[j].first) {
swap(circles[i], circles[j]);
}
}
}
double t_mid = 0, t_res, prev_mid;
cout << fixed;
cout.precision(10);
for (int q = 0; q < N - 1; q++) {
t_min= circles[q].first;
t_max= circles[q+1].first;
while (1) {
prev_mid = t_mid;
t_mid = (t_min + t_max) / 2.0;
if (prev_mid > t_mid) {
if (prev_mid - t_mid < 0.000000000001) {
cout << t_mid << " ";
break;
}
}
else {
if (t_mid - prev_mid < 0.000000000001) {
cout << t_mid << " ";
break;
}
}
t_res = 0;
for (int i = 0; i < N; i++) {
if (circles[i].first < t_mid) {
t_res += circles[i].second / ((t_mid - circles[i].first) * (t_mid - circles[i].first));
}
else if (circles[i].first > t_mid) {
t_res -= circles[i].second / ((t_mid - circles[i].first) * (t_mid - circles[i].first));
}
}
if (t_res == 0) {
cout << t_mid << " ";
break;
}
else if (t_res > 0) {
t_min = t_mid;
}
else {
t_max = t_mid;
}
}
}
cout << "\n";
}
return 0;
}
반응형
'algo' 카테고리의 다른 글
SWEA(SW Expert Academy) string C++ (0) | 2021.09.17 |
---|---|
SW Expert Academy Magnetic C++ (0) | 2021.09.16 |
samsung sw academy 최대상금 문제 C++ (0) | 2021.09.15 |