알고리즘/algospot

algospot ARCTIC

꾸준함. 2018. 2. 24. 00:07

문제 링크입니다: https://algospot.com/judge/problem/read/ARCTIC

http://jaimemin.tistory.com/421?category=985009와 유사하게 이분법을 사용하여 푸는 문제였습니다.

한가지 흠이라면 ARCTIC은 북극이므로 제목을 북극기지로 지었어야했다는 점입니다.


/*

남극에는 N 개의 탐사 기지가 있습니다.남극의 겨울은 혹독하기 때문에, 남극의 겨울이 찾아오면 탐사 기지들간의 왕래가 중단됩니다.

겨울에도 서로 통신하며 연구를 지속하기 위해, N 개의 무전기를 구입해 각 탐사 기지에 배치하려 합니다.

이 때, 두 탐사 기지 사이의 거리가 D 라고 하면, 무전기의 출력이 D 이상이어야만 통신이 가능합니다.

모든 탐사 기지에는 똑같은 무전기가 지급됩니다.

탐사 본부가 다른 모든 기지에 연락을 할 수 있기 위해 필요한 무전기의 최소 출력은 얼마일까요 ?

*/

#include <iostream>

#include <vector>

#include <queue>

#include <iomanip>

#include <cmath>

using namespace std;

 

const int MAX = 100;

 

int N; //탐사기지 수

//두 기지 사이의 거리를 미리 계산

double dist[MAX][MAX];

 

//거리 d 이하인 기지들만을 연결했을 때 모든 기지가 연결되는지 여부를 반환한다

bool decision(double d)

{

        vector<bool> visited(N, false);

        visited[0] = true;

        queue<int> q;

        q.push(0);

        int check = 0;

 

        while (!q.empty())

        {

               int here = q.front();

               q.pop();

               ++check;

               for (int there = 0; there < N; there++)

                       if (!visited[there] && dist[here][there] <= d)

                       {

                              visited[there] = true;

                              q.push(there);

                       }

        }

        return check == N;

}

 

//모든 기지를 연결할 수 있는 최소의 d를 반환

double optimize(void)

{

        double low = 0, high = 1416.00; //10002 ~= 14145...

        for (int i = 0; i < 100; i++)

        {

               double mid = (low + high) / 2;

               //mid가 가능하다면, 더 좋은(작은) 답을 찾는다

               if (decision(mid))

                       high = mid;

               //mid가 불가능하다면, 더 나쁜() 답을 찾는다

               else

                       low = mid;

        }

        return high;

}

 

int main(void)

{

        int test_case;

        cin >> test_case;

        if (test_case < 1 || test_case>50)

               exit(-1);

 

        for (int i = 0; i < test_case; i++)

        {

               cin >> N;

               if (N > MAX)

                       exit(-1);

 

               vector<pair<double, double>> coord;

               for (int j = 0; j < N; j++)

               {

                       double y, x;

                       cin >> y >> x;

                       coord.push_back(make_pair(y, x));

               }

 

               for(int j=0; j<N; j++)

                       for (int k = 0; k < N; k++)

                       {

                              pair<double, double> point1 = coord[j];

                              pair<double, double> point2 = coord[k];

                              //거리 구하기 공식 √((x2-x1)^2+(y2-y1)^2)

                              dist[j][k] = sqrt((point2.first - point1.first)*(point2.first - point1.first) + (point2.second - point1.second)*(point2.second - point1.second));

                       }

 

               cout << fixed << setprecision(2);

               cout << optimize() << endl;

        }

        return 0;

}


개발환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~


[참고] 프로그래밍 대회에서 배우는 알고리즘 문제해결전략

반응형

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

algospot KAKURO1  (0) 2018.02.25
algospot CANADATRIP  (0) 2018.02.25
algospot DARPA  (0) 2018.02.23
algospot KAKURO2  (0) 2018.02.21
algospot ALLERGY(최적화 버전)  (0) 2018.02.21