[백준/C++] 1744번: 수 묶기
[백준/C++] 1744번: 수 묶기
문제 & 링크
https://www.acmicpc.net/problem/1744
풀이
합이 최대가 되도록 하려면 큰 수는 큰 수와 묶여서 곱해져야 한다.
음수의 경우 무조건 음수 or 0이랑 묶여서 곱했을 때, 0보다 큰 정수를 만들어야 한다.
1번과 2번을 바탕으로 음수와 0은 오름차순으로, 양수는 내림차순으로 우선순위 큐에 삽입한다.
각 우선순위 큐에서 top에 해당하는 두 원소를 뽑아 곱하고 ans에 더한다. 만약 top에 해당하는 원소가 하나밖에 없을 경우 그냥 ans에 더한다. 이때 1의 경우 다른 수와 곱해도 그대로이기에, 묶지 않고 그대로 더해야 최대 ans를 만들 수 있다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>
#include <queue>
using namespace std;
priority_queue<int, vector<int>, greater<int>> n_pq;
priority_queue<int> p_pq;
int main() {
int N;
cin >> N;
int num;
for (int i = 0; i < N; i++) {
cin >> num;
if (num <= 0) n_pq.push(num);
else p_pq.push(num);
}
int ans = 0;
int first, second;
while (!n_pq.empty()) {
first = n_pq.top();
n_pq.pop();
if (n_pq.empty()) {
ans += first;
break;
}
second = n_pq.top();
n_pq.pop();
ans += first * second;
}
while (!p_pq.empty()) {
first = p_pq.top();
p_pq.pop();
if (p_pq.empty()) {
ans += first;
break;
}
second = p_pq.top();
p_pq.pop();
if (first != 1 && second != 1) ans += first * second;
else ans += first + second;
}
cout << ans;
}
This post is licensed under CC BY 4.0 by the author.
