题目链接: Maximum Product
大致题意
给你n个数字, 你要从中挑选出5个数字, 使得他们的乘积最大.
输出最大的乘积
解题思路
这个题一读完, 思路并不是难点, 因为我们很容易想到很多种合法的方式.
但是我们要通过代码来实现, 这就不是很容易了. 我们最笨的方式当然是去模拟每一种我们人脑认为的合法情况, 但显然太麻烦了.
我们可以发现, 给出的n个数字中, 如果某个数字x, 既不是最大的5个数字, 也不是最小的5个数字, 则它是没有意义的. 很显然, 如果我们能凑出一个正数, 我们肯定尽可能挑大的, 反之如果我们只能得到负数(或0), 我们一定挑尽可能小的, 因此处于中间位置的数字我们永远不会用到.
如果我们能想到这里, 我们接下来的代码实现就可以偷个懒了, 我们不妨对于所有的数字小到大排序, 此时假设我选a个最小的, 那么我就要选5-a个最大的. 我们可以通过循环来枚举a∈[0, 5] 来暴力计算答案.
AC代码
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 1; i <= (n); ++i)
using namespace std;
typedef long long ll;
const int N = 1E5 + 10;
ll a[N];
int main()
{
int t; cin >> t;
while (t--) {
int n; scanf("%d", &n);
rep(i, n) scanf("%lld", &a[i]);
sort(a + 1, a + 1 + n);
ll res = LLONG_MIN;
for (int i = 0; i <= 5; ++i) {
ll now = 1;
rep(k, i) now *= a[k];
rep(k, 5 - i) now *= a[n - k + 1];
res = max(res, now);
}
printf("%lld\n", res);
}
return 0;
}