[Codeforces] Codeforces Round #670 (Div. 2) B. Maximum Product
問題
方針
\( n \) 個の整数 \( a \) が与えられ、
\[ a_i a_j a_k a_l a_t \ (i < j < k < l < t)\]
の最大値を答えます。添え字に制約がありますが、この問題は \( a \) から任意に \( 5 \) 個の整数を選ぶことができます。したがって、以下のパターンを考えればよいです。
- \( a \) の最大値 \( 5 \) つ
- \( a \) の最小値 \( 5 \) つ
- \( a \) の最小値 \( 2 \) つと最大値 \( 3 \) つ
- \( a \) の最小値 \( 4 \) つと最大値 \( 1 \) つ
コード
#include <bits/stdc++.h> using namespace std; typedef long long ll; int n; ll a[100000]; ll solve(int n) { sort(a, a + n); ll best = LLONG_MIN; ll v1 = 1; vector<ll> p, q; for (int i = 0; i < n; i++) { if (a[i] < 0) { p.push_back(a[i]); } if (a[i] > 0) { q.push_back(a[i]); } } for (int i = 0; i < 5; i++) { v1 *= a[i]; } best = max(best, v1); v1 = 1; for (int i = n - 1; i >= n - 5; i--) { v1 *= a[i]; } best = max(best, v1); int idx = q.size() - 1; if (p.size() >= 2 && q.size() >= 3) { best = max(best, p[0] * p[1] * q[idx] * q[idx - 1] * q[idx - 2]); } if (p.size() >= 4 && q.size() >= 1) { best = max(best, p[0] * p[1] * p[2] * p[3] * q[idx]); } return best; } int main() { int t; cin >> t; ll ans[t]; for (int i = 0; i < t; i++) { cin >> n; for (int j = 0; j < n; j++) { cin >> a[j]; } ans[i] = solve(n); } for (ll i : ans) { cout << i << "\n"; } return 0; }
ディスカッション
コメント一覧
まだ、コメントがありません