본문 바로가기

algo

SW Expert Academy 균형점 C++

개인적인 풀이이니 참고만 하시길 바랍니다.
건설적인 비판과 의견은 대환영입니다 :)

문제

[S/W 문제해결 응용] 2일차 - 균형점
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV15MeBKAOgCFAYD

위 문제는 이분탐색을 이용해서 각 구간별 양쪽 인력 계산값이 0이 되는 점을 찾았다. 계산식에서 균형점의 무게와 G값은 무시해도 되는것을 알 수 있다.
이번에도 역시나 무식한 나의 머리때문에 몸이 고생했는데, 모든 자성체 사이의 모든 균형점을 다 찾아야하는데, 나란 인간은 한개의 선에서 하나의 균형점만 찾고있었다.(문제쫌 끝까지 자세히 읽자 ㅠ)

그리고 문제를 해결하면서 부동소수점 계산 관련 아주 좋은 링크를 찾았다 !
https://www.acmicpc.net/blog/view/37

 

부동소숫점 오류

게시판에 올라오는 "이 코드는 왜 틀렸나요?" 류의 질문 중 부동소숫점 오류 때문에 틀리는 경우가 꽤 많이 보여서 간단하게 몇 가지 써봅니다. 0. 부동소숫점 오류 모든 실수를 8byte, 혹은 12~16byte

www.acmicpc.net

코드

#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