먼저 입력을 양수, 음수 각각 따로 벡터에 저장을하고 0입력의 개수는 따로 변수에 저장한다.
그리고 음수는 내림차순으로 정렬, 양수는 오름차순으로 정렬한다.
정렬했으므로 양수는 큰수부터 두개씩 묶어서 곱하면되는데, 1과 2같은 경우에는 더하는게 더 값이 크므로 더한값과 곱한값을 비교해서 더큰 값을 ans에 더해준다.
이후 양수의 개수가 홀수라면 하나가 남으니까 남는것을 ans에 더해준다.
이제 음수는 가장 작은것 두개를 곱해주면 가장 큰 양수가 되므로 작은것부터 두개씩 곱해주고 pop연산을 해서 빼준다.
두개씩 묶어 가장 큰 수를 만들어주고 난 후 입력 수열중에 0이 있고 neg가 비어있지 않다면 그 수는 0과 묶어 (0 n) 으로 0을 만들어줄 수 있으니까 pop해준다.
ex) {-1, -2, -3, 0} -> (-2 -3) + (-1 * 0) = 6
입력 수열 중에 0이 없다면 남은것을 그냥 ans에 더해주면 된다.
ex) {-1, -2, -3} -> (-3 * -2) + (-1) = 5
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<map>
using namespace std;
vector<int> p;
vector<int> neg;
int zero;
int main(void)
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
int a;
cin >> a;
if (a > 0)
p.push_back(a);
else if (a == 0)
zero++;
else
neg.push_back(a);
}
sort(neg.begin(), neg.end(),greater<int>());
sort(p.begin(), p.end());
int ans = 0;
for (int i = p.size() - 1; i >= 1; i -= 2)
{
if(p[i] + p[i-1] > p[i] * p[i-1])
ans += p[i] + p[i - 1];
else
ans += p[i] * p[i - 1];
}
if (p.size() % 2 == 1)
ans += p[0];
for (int i = neg.size() -1; i >=1; i -= 2)
{
ans += neg[i] * neg[i-1];
neg.pop_back();
neg.pop_back();
}
if (!neg.empty() && zero)
neg.pop_back();
else if (!neg.empty() && !zero)
ans += neg[0];
cout << ans;
}