알고리즘

[C++] 백준 20300번 : 서강근육맨

88dldl 2024. 3. 14. 21:52

https://www.acmicpc.net/problem/20300

 

20300번: 서강근육맨

PT 첫째 날에 $1$과 $4$를 선택하고, 둘째 날에 $2$와 $3$을 선택하고, 마지막 날에 $5$를 선택하면 $M$은 $5$가 되며, 이때가 $M$이 최소일 때이다.

www.acmicpc.net

 

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int n;
long health=-1;
vector<long> v;

void solve(){
    int tmpn=n;
    long tmpnum;
    if(n%2==1){
        tmpn=n-1;
    }
    for(int i=0;i<tmpn/2;i++){
        tmpnum=v[i]+v[tmpn-i-1];
        health=max(tmpnum,health);
    }    ㅁ
    if(n%2==1){
        health=max(v[n-1],health);
    }
    cout<<health;
}

int main()
{
    cin>>n;
    for(int i=0;i<n;i++){
        long tmp;
        cin>>tmp;
        v.push_back(tmp);
    }
    sort(v.begin(),v.end());
    solve();    
    return 0;
}

 

sort 한후 solve()함수 

 

[기구의 개수가 홀수일 경우 ]

1. 기구의 개수가 홀수개라면 제일 큰 근손실정도를 가지는 기구를 제외한 후,

2. - (제일작은 근손실을 가지는 기구 + 제일 큰 근손실정도를 가지는 기구)

    - (2번째로 작은 근손실을 가지는 기구)+(2번째로 큰 근손실 정도를 가지는 기구)

    - (...)....

    를 각각 비교해주어 max값을 가지는 값을 구한다.

3. 2에서 구한 max값과 제일 큰 근손실정도를 가진 기구를 비교하여 max값을 찾아낸다. 

 

[기구의 개수가 짝수일 경우 ]

1. 짝수개라면 위의 방법에서 2번만 진행한다.