문제

https://codeforces.com/problemset/problem/1406/B

걸린 시간

01 : 16 : 18 실패

풀이

C++

#include <bits/stdc++.h>
#define INF 987654321
using namespace std;

vector<int> pos, neg;

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    int tc;
    cin >> tc;
    while(tc--){
        int n, a;
        cin >> n;
        pos.clear(); neg.clear(); 
        for(int i = 0; i < n; i++){
            cin >> a;
            if(a >= 0)
                pos.push_back(a);
            else
                neg.push_back(a);
        }
        sort(pos.begin(), pos.end(), greater<int>());
        sort(neg.begin(), neg.end());
        long long ans = -pow(3000, 5), cur = 1;
        // 입력이 음수로만 주어질 때
        if(pos.size() == 0){
            for(int j = 0; j < 5; j++)
                cur *= neg[neg.size()-j-1];
            ans = cur;
        }
        // 최대 양수, 음수 조합
        for(int i = 0; i <= 5; i++){
            cur = 1;
            if(5-i > pos.size() || i > neg.size()) continue;
            for(int j = 0; j < 5-i; j++)
                cur *= pos[j];
            for(int j = 0; j < i; j++)
                cur *= neg[j];
            ans = max(ans, cur);    
        }
        cout << ans << "\n";
    }
    return 0;
}

원소 5개로 이루어진 부분배열의 최대곱을 구하는 문제이다.

풀이 방법은 여러가지가 있는 것 같은데 그 중에서 정렬 후 최대곱이 나올 수 있는 경우의 수를 모두 시도해보는것이 제일 간단해보였다.

최대곱은 양수 음수의 개수가 각각 (5, 0), (3, 2), (1, 4) 인 3가지 경우에서 발생할 것이라 생각하고 풀이했지만 틀린 답이 출력되었다.

입력이 모두 음수로 주어질 때가 반례였다.

1
5
-5 -4 -3 -2 -1 -1
정답 : -12
출력 : -60

음수의 경우 절대값이 작은 5개의 수들의 곱이 최대값이다.

다른 풀이

C++

#include <bits/stdc++.h>
#define INF 987654321
using namespace std;

vector<int> a;

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    int tc;
    cin >> tc;
    while(tc--){
        int n;
        cin >> n;
        a.resize(n);
        for(int& i : a) cin >> i;
        sort(a.begin(), a.end());
        long long ans = -pow(3000, 5);
        for(int i = 0; i <= 5; i++){
            long long cur = 1;
            for(int j = 0; j < 5-i; j++)
                cur *= a[j];
            for(int j = 0; j < i; j++)
                cur *= a[n-1-j];
            ans = max(ans, cur);    
        }
        cout << ans << "\n";
    }
    return 0;
}

하나의 배열만을 사용하면 문제가 더욱 간단해진다.

정렬 후 앞과 뒤에서 적절히 5개를 선택하게 되므로 값이 최대가 되는 경우의 수를 빠짐없이 시도해볼 수 있다.

'Codeforces' 카테고리의 다른 글

Codeforces #1399B Gifts Fixing  (0) 2020.09.18
Codeforces #1399A Remove Smallest  (0) 2020.09.18
Codeforces #1401A Distance and Axis  (0) 2020.09.16
Codeforces #1418A Buying Torches  (0) 2020.09.16
Codeforces Round #670 (Div. 2) A  (0) 2020.09.13

댓글