728x90
https://www.acmicpc.net/problem/20300
20300번: 서강근육맨
PT 첫째 날에 $1$과 $4$를 선택하고, 둘째 날에 $2$와 $3$을 선택하고, 마지막 날에 $5$를 선택하면 $M$은 $5$가 되며, 이때가 $M$이 최소일 때이다.
www.acmicpc.net
접근 방법
중요한 점)
1. 근손실 M을 넘지 않도록 설정한다는 것.
2. 하루에 운동 기구를 2개씩 사용
3. 홀수 일이면 마지막 날은 1개만 사용
이를 종합하면 2개씩 짝지은 합이 최소가 되고, 홀수 일 경우 가장 큰 값을 혼자 남겨놔야 최소가 된다.
따라서, 알고리즘은 다음과 같다.
전제: 오름차순 혹은 내림차순으로 정렬 / 마지막 값을 비교 대상(res)으로 설정
i) 짝수일 경우.
가장 큰 것과 가장 작은 것을 서로 짝지어서 합과 res를 비교
ii) 홀수일 경우.
가장 큰 값을 제외한 나머지를 가장 큰 것과 가장 작은 것을 서로 짝지어 합과 res를 비교
코드
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
int n;
vector<long long> v;
int main() {
long long tmp;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> tmp;
v.push_back(tmp);
}
sort(v.begin(), v.end());
int i = 0;
int j = n-1;
if (j % 2 == 0) j--;
long long res = v[n-1];
while (i < j) {
if (res < v[i] + v[j])
res = v[i] + v[j];
i++; j--;
}
cout << res;
}
값의 범위를 신경써주자...
int일 경우, 표현 범위를 넘어서 틀림!!
728x90
'📊알고리즘 > BOJ' 카테고리의 다른 글
[그리디 #13] BOJ 13164 - 행복 유치원 (1) | 2024.02.14 |
---|---|
[그리디 #12] BOJ 20365 - 블로그2 (0) | 2024.02.13 |
[그리디 #10] BOJ 20115 - 에너지 드링크 (0) | 2024.02.12 |
[그리디 #9] BOJ 11508 - 2+1 세일 (0) | 2024.02.11 |
[그리디 #8] BOJ 1758 - 알바생 강호 (0) | 2024.02.11 |