import java.util.Arrays;
import java.util.Scanner;
public class Max_product2 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int k = in.nextInt();
int mod = 1000000009;
int[] a = new int[n];
for (int i = 0; i < n; i++) {
a[i] = in.nextInt();
}
in.close();
Arrays.sort(a);
//初始化双指针
int l = 0;
int r = n-1;
long res = 1;
int flag = 1;
if(k % 2 == 1) {//如果k是奇数,先挑出一个最大的
res = (long)a[n-1];//奠定答案是正是负的基调。因为下面的x和y一定都是正数
if(a[n-1] < 0) flag = -1;//证明全是负数
r--;//右指针移动
k--;
}
while (k != 0) {
long x = (long)a[l] * a[l + 1] , y = (long)a[r] * a[r - 1];//两边同时取对
if(x*flag > y*flag) { //如果flag为-1,这里巧妙的比较负数的大小。而不是绝对值的大小
//不可以写成是 res % mod * x % mod,因为res是一定小于mod的。而(res*x)不一定没超出范围,x才是未知的,应该先把x%mod,让x缩小,再乘以res。最后再%mod
res = x % mod * res % mod;
l += 2;//左指针移动
}else {
res = y % mod * res % mod;
r -= 2;//右指针移动
}
k -= 2;
}
System.out.println(res);
}
}
思路:既然要最大值,我们先排序。观察看看。列举所有可能的情况并且不能有遗漏,最好简洁。我们从k的奇偶入手。
1.k是偶数。1)负数是偶数。那么答案肯定是正数。因为如果必须要选,我们只选偶数个负数就好了。负负得正。
2)负数是奇数。那么答案肯定也是正数。因为如果必须要选,我们只选奇数中偶数个负数就好了。负负得正。
2.k是奇数。1)负数是偶数。那么。。。(跟上面一模一样)
4)特殊性,如果k是奇数,并且所有数字都是负数,那么答案一定是负数。(答案为负只有这一种情况)
为了让代码利用性高。当k是奇数时,我们可以先挑选一个最大的数字当作初始res,此时k就变成偶数了。我们跳到上面的代码,把最大值算出来,再和这个res相乘,就是最大乘积了。
写的乱乱的。因为我是做错了,到网上看答案自己再做一遍的。其中错了好几次,因为我是看了大概思路自己做的,不是直接抄哒。代码都懂了现在但是以后出这样的题不一定自己能想出来。如果有疑问的地方可以问我噢,我肯定能解答。
乘积最大_蓝桥杯第九届 _Java
最新推荐文章于 2025-12-02 15:55:42 发布
本文探讨了如何通过Java代码实现找到给定数组中,当k为奇数时最大乘积的策略,利用双指针和排序技巧。关键步骤包括初始化、奇偶判断和动态调整双指针。
1万+





