Codeforces1406B Maximum Product

题目链接: 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;
}

END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逍遥Fau

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值