樂山師範程式設計大賽2020-C: 最大乘積【思維】
阿新 • • 發佈:2020-12-20
技術標籤:比賽
題目描述
給定一個長度為 n 的整數陣列 a1, a2, …, an 。從中找到乘積最大的五個整數 ai, aj, ak, al, at (i < j < k < l < t) 。
輸入
輸入包含多組資料;
第一行輸入一個正整數t (1 ≤ t ≤ 2 × 104),表示測試資料的組數。
每組測試資料都包含兩行資料;
第一行輸入一個正整數n (5 ≤ n ≤ 105),表示陣列的長度;
第二行輸入用空格隔開的n個整數 a1, a2, …, an (−3 × 103≤ ai ≤ 3 × 103) 。
所有組 n 的和不超過 2 × 105 。
輸出
對於每一組測試資料,輸出陣列中任意五個整數的最大的乘積。
樣例輸入
4
5
-1 -2 -3 -4 -5
6
-1 -2 -3 1 2 -1
6
-1 0 0 0 -1 -1
6
-9 -7 -5 -3 -2 1
樣例輸出
-120
12
0
945
提示
針對第一組測試資料,只能選擇 (−1) × (−2) × (−3) × (−4) × (−5)=−120 ;
針對第二組測試資料,最好的選擇是 (−1) × (−2) × (−3) × 2 × (−1)=12 ;
針對第三組測試資料,任意選擇五個整數,乘積的結果必定是 0 ;
思路
最大值只可能為
1.2個最小負數,3個最大正數;
2.4個最小負數,1個最大正數;
3.5個最大正數。
4.其他情況只有負數,或者是隻有負數和零。都被1,2,3判了。
AC程式碼
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1e5 + 5;
ll a[MAXN];
void solve() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; ++i) {
scanf("%lld", &a[i]);
}
sort(a, a + n);
ll ans = a[0] * a[1] * a[n - 1] * a[n - 2] * a[n - 3];
ans = max(ans, a[0] * a[1] * a[2] * a[3] * a[n - 1]);
ans = max(ans, a[n - 1] * a[n - 2] * a[n - 3] * a[n - 4] * a[n - 5]);
printf("%lld\n", ans);
}
int main() {
int t;
scanf("%d", &t);
for (int i = 0; i < t; ++i) {
solve();
}
return 0;
}