백준 11597 Excellence [c++]

어제부터 한국어 아닌 문제만 고르는중…

문제 분석

  • 영어…

번역

문제

세계 코딩 연맹은 한 쌍의 프로그래머로 구성된 팀의 거대한 온라인 프로그래밍 토너먼트를 준비하고 있다.
데이비드 심판은 남동부 대표단의 팀을 구성하는 일을 맡고 있다. 모든 학생들은 정확히 두 명이 한 팀으로 구성되어야 한다. 다행히도, 전체 학생 수는 짝수이다.
하지만, 그는 경기에 출전하는 각 팀이 최소 총 등급을 충족하도록 함으로써 다른 심사위원들 사이에서 그의 순수한 평판을 유지하기를 원합니다. 우리는 팀의 총 등급을 팀에 있는 두 개인의 등급의 합으로 정의한다.

David가 X보다 크거나 같은 총 등급을 가진 팀을 구성할 수 있도록 최대값 X를 결정하도록 도와줍니다.

입력

첫 번째 줄에는 온라인 프로그래밍 토너먼트에 참가하려는 학생 수 n이 주어진다(1 ≤ n ≤ 10^5, n은 짝수). 다음 n개의 행 각각은 학생 i의 등급인 단일 정수 si(1 ≤ si ≤ 10^6)가 입력된다.

출력

David가 모든 팀의 총 등급이 X 이상인 팀을 구성할 수 있도록 최대 값 X를 한 줄에 인쇄합니다.

분석

  • 학생들이 받을 수 있는 점수들이 주어짐.
  • 두 명이 한 팀을 이룰 때, 팀의 점수는 두 학생의 점수 합이 됨.
  • 모든 팀의 점수가 X이상을 만족하는 최댓값 X는?

입력조건

학생의 수 N
N줄에 걸쳐 {
	각 학생이 얻는 점수 a
}

풀이과정

  • 입력을 전부 정렬한 뒤,
  • 0번이랑 n-1꺼를 더하고,
  • 1번이랑 n-2를 더하고 하는 식으로 진행해서,
  • 더해진 점수들의 최솟값 출력.

전체 코드

#include <iostream>
#include <algorithm>

using namespace std;

int main() {
    int num;
    cin >> num;
    int arr[num];
    for(int i = 0; i < num; i++){
        cin >> arr[i];
    }
    sort(arr, arr + num);

    int hn = num/2;
    int minnum = arr[0] + arr[num-1];
    for(int i = 1; i <hn; i++)
        minnum = min(arr[i] + arr[num-1-i], minnum);

    cout << minnum;
}