알고리즘/algospot

algospot FESTIVAL

꾸준함. 2018. 1. 7. 19:21

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


/*

커다란 공연장을 빌려서 록 페스티벌을 개최하려고 합니다.

이 페스티벌은 여러 날 동안 진행되며, 하루에 한 팀의 밴드가 공연장에서 콘서트를 하게 됩니다.

공연장은 하루 빌리는 데 드는 비용이 매일매일 다릅니다.

때문에 공연 일정을 잘 정해서 공연장 대여 비용을 줄이려고 합니다.

앞으로 N일 간의 공연장 대여 비용을 알고 있다고 합시다.

이 중 L일 이상을 연속해서 대여하되, 공연장을 하루 빌리는데 드는 평균 비용을 최소화하려면 어떻게 공연장을 빌려야할까

*/

#include <iostream>

using namespace std;

 

int main(void)

{

        int test, rent, team; //테스트 케이스 수, 대여할 수 있는 날들의 수, 섭외한 공연 팀의 수

        cin >> test;

        if (test <= 0 || test > 100)

        {

               cout << "1 이상 100 이하여야 합니다" << endl;

               exit(1);

        }

        double *result = new double[test];

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

        {

               cin >> rent >> team;

               if (rent <= 0 || rent > 1000)

               {

                       cout << "대여할 수 있는 날은 1일 이상 1000일 이하여야 합니다" << endl;

                       exit(1);

               }

               if (team > rent || team <= 0 || team > 1000)

               {

                       cout << "섭외한 공연 팀의 수는 대여할 수 있는 날보다 적어야 하고 1팀 이상 1000팀 이하여야 합니다" << endl;

                       exit(1);

               }

               int *arr = new int[rent];

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

                       cin >> arr[j];

               double min = 1000.00000000; //적당히 큰 숫자

               for (int j = team; j <= rent; j++)

               {

                       int cnt = 0;

                       while (j + cnt <= rent) //범위가 rent를 초과해서는 안되므로

                       {

                              int sum = 0;

                              for (int k = cnt; k < j + cnt; k++)

                                      sum += arr[k];

                              if (min > (double)sum / j)

                                      min = (double)sum / j;

                              cnt++;

                       }

               }

               result[i] = min;

               delete[]arr;

        }

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

               printf("%.8lf\n", result[i]); //10^(-7) 이하의 절대/상대 오차가 있는 답은 정답 처리된다고 하였으므로

        delete[]result;

        return 0;

}


개발환경:Visual Studio 2017


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


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

반응형

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

algospot TSP1  (3) 2018.01.22
algospot BOARDCOVER  (0) 2018.01.21
algospot PICNIC  (0) 2018.01.21
algospot BOGGLE  (0) 2018.01.21
c++ 연속된 부분 구간 중 그 합이 최대인 구간 찾기  (0) 2018.01.19