Baekjoon/Silver

C++ / 백준 / 20300 / 서강근육맨

GitHubSeob 2023. 7. 5. 20:10
문제

 

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>
#define ll long long
#define END loss.size() -1
using namespace std;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);

	ll N(0), idx(0), answer(0);

	cin >> N;
	vector<ll>loss(N, 0);
	for (idx = 0; idx < N; ++idx) {
		cin >> loss[idx];
	}

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

	if (N % 2 == 0) {
		for (idx = 0; idx < N/2; ++idx) {
			answer = max(answer, loss[idx] + loss[END - idx]);
		}
	}
	else if (N % 2 != 0) {
		answer = loss[END];
		for (idx = 0; idx < N / 2; ++idx) {
			answer = max(answer, loss[idx] + loss[END - 1 - idx]);
		}
	}
	cout << answer;
}