1. 程式人生 > 其它 >樂山師範程式設計大賽2020-C: 最大乘積【思維】

樂山師範程式設計大賽2020-C: 最大乘積【思維】

技術標籤:比賽

題目描述

給定一個長度為 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 ;

針對第四組測試資料,最好的選擇是 (−9) × (−7) × (−5) × (−3) × 1=945 。

思路

最大值只可能為
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; }