※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 2036번 문제인 수열의 점수이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/2036 

 

2036번: 수열의 점수

n개의 정수로 이루어진 수열이 있다. 이 수열에서 한 정수를 제거하거나, 또는 두 정수를 제거할 수 있다. 한 정수를 제거하는 경우에는 그 정수가 점수가 되고, 두 정수를 제거하는 경우에는 두

www.acmicpc.net

1보다 큰 양수는 큰 수부터 두 개씩 차례로 곱해 더하고 음수는 작은 수부터 두 개씩 차례로 곱해 더하는 그리디한 전략으로 문제를 해결할 수 있다.

 

1의 경우 다른 수와 곱해 더하는 것보다 따로 더할 때 전체 합이 1 더 커진다는 점을 놓치지 말자.

또한 문제의 답이 32비트 정수 자료형의 범위를 넘어설 수 있음에 유의하자.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <queue>
using namespace std;
typedef long long ll;

int N;
int cnt[2];
priority_queue<int, vector<int>, greater<>> negque;
priority_queue<int> posque;

ll ans;

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

	cin >> N;
	while (N--) {
		int x; cin >> x;
		if (x > 1) posque.push(x);
		else if (x < 0) negque.push(x);
		else cnt[x]++;
	}

	while (negque.size() > 1) {
		ll val1 = negque.top(); negque.pop();
		ll val2 = negque.top(); negque.pop();
		ans += val1 * val2;
	}
	while (posque.size() > 1) {
		ll val1 = posque.top(); posque.pop();
		ll val2 = posque.top(); posque.pop();
		ans += val1 * val2;
	}

	if (posque.size()) ans += posque.top();
	if (negque.size() && !cnt[0]) ans += negque.top();
	ans += cnt[1];

	cout << ans;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 8219 // C++] Coprime Numbers  (0) 2024.01.24
[BOJ 2428 // C++] 표절  (1) 2024.01.23
[BOJ 2910 // C++] 빈도 정렬  (0) 2024.01.21
[BOJ 2840 // C++] 행운의 바퀴  (0) 2024.01.20
[BOJ 2865 // C++] 나는 위대한 슈퍼스타K  (1) 2024.01.19

+ Recent posts