알고리즘/algospot

algospot DARPA

꾸준함. 2018. 2. 23. 00:10

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

답이 자연수로 표현 가능하더라도 소수 둘째자리까지 표현하는 것이 포인트이기 때문에 iomanip 헤더파일을 추가하고

cout << fixed << setprecision(2)를 추가해주는 것이 중요했습니다.


/*

DARPA Grand Challenge 는 운전자 없는 차들을 컴퓨터 인공지능으로 조작해 누가 먼저 결승점에 도달하느냐를 가지고 겨루는 인공지능 대회입니다.

2004 DARPA Grand Challenge 의 과제는 사막을 가로지르는 240km 도로를 완주하는 것이었습니다.

우리는 이 경기를 N 개의 카메라로 중계하려고 합니다.

이 도로에는 카메라를 설치할 수 있는 곳이 M 군데 있습니다.

여기에 카메라를 배치하여, 가장 가까운 두 카메라 간의 간격을 최대화하고 싶습니다.

이와 같은 배치를 찾아내는 프로그램을 작성하세요.

*/

#include <iostream>

#include <vector>

#include <algorithm>

#include <iomanip>

using namespace std;

 

int cameraNum, installNum; //카메라 갯수와 설치 가능 갯수

 

//결정 문제: 정렬되어 있는 locations cameras를 선택해 모든 카메라 간의 간격이

//gap 이상이 되는 방법이 있는지 반환

bool decision(const vector<double> &location, int cameras, double gap)

{

        //카메라를 설치할 수 있을 때마다 설치하는 탐욕적 알고리즘

        double limit = -1;

        int installed = 0;

        for (int i = 0; i < location.size(); i++)

        {

               if (limit <= location[i])

               {

                       ++installed;

                       //location[i]+gap 이후는 되어야 카메라 설치 가능

                       limit = location[i] + gap;

               }

        }

        //결과적으로 cameras대 이상을 설치할 수 있었으면 성공

        return installed >= cameras;

}

 

//최적화 문제: 정렬되어 있는 locations cameras를 선택해 최소 간격을 최대화

double optimize(const vector<double> &location, int cameras)

{

        double low = 0, high = 241;

        //반복문 불변식:decision(low) && !decision(high)

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

        {

               double mid = (low + high) / 2.0;

               //간격이 mid 이상이 되도록 할 수 있으면 답은 [mid, hi]에 있다

               if (decision(location, cameras, mid))

                       low = mid;

               else

                       high = mid;

        }

        return low;

}

 

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++)

        {

               vector<double> location;

               cin >> cameraNum >> installNum;

 

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

               {

                       double coord;

                       cin >> coord;

                       location.push_back(coord);

               }

               sort(location.begin(), location.end());

               cout << fixed << setprecision(2);

               cout << optimize(location, cameraNum) << endl;

        }

        return 0;

}


개발환경:Visual Studio 2017


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


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

반응형

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

algospot CANADATRIP  (0) 2018.02.25
algospot ARCTIC  (0) 2018.02.24
algospot KAKURO2  (0) 2018.02.21
algospot ALLERGY(최적화 버전)  (0) 2018.02.21
algospot ALLERGY  (0) 2018.02.20