https://www.acmicpc.net/problem/1744
1744번: 수 묶기
길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에
www.acmicpc.net
그리디한 접근법이 약간 까다로웠던 문제이다.
두 수를 묶는 경우의 수는 다음과 같다.
- 음수와 음수
- 음수와 0
- 0과 양수
- 음수와 양수
- 양수와 양수
- 1과 1이 아닌 양수
- 1이 아닌 양수와 1이 아닌 양수
1번과 2번의 경우 곱하기를 하는 것이 최대이다.
3번과 4번의 경우 더하기를 하는 것이 최대이다.
5-1번의 경우 더하기를 하는 것이 최대이다.
5-2번의 경우 곱하기를 하는 것이 최대이다.
위 규칙만 잘 이용한다면 쉽게 풀어낼 수 있다.
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
int a[51] = { 0, };
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
sort(a + 1, a + n + 1);
int ans = 0;
for (int i = 1; i <= n; i++) {
if (a[i] < 0) {
if (i < n && a[i + 1] <= 0) {
ans += a[i] * a[i + 1];
i++;
}
else ans += a[i];
}
else if (a[i] == 0) {
continue;
}
else {
if (n % 2 != i % 2 && i < n && a[i] != 1) {
ans += a[i] * a[i + 1];
i++;
}
else ans += a[i];
}
}
cout << ans;
}
'ps' 카테고리의 다른 글
[백준] 2873 - 롤러코스터 (0) | 2022.07.25 |
---|---|
[백준] 8980 - 택배 (0) | 2022.07.19 |
[백준] 1854 - K번째 최단경로 찾기 (0) | 2022.07.19 |
[백준] 13904 - 과제 (0) | 2022.07.19 |
[백준] 11003 - 최솟값 찾기 (0) | 2022.07.14 |
댓글