⭐ 乘积最大
输入样例1
5 3
-100000
-10000
2
100000
10000
输出样例1
999100009
输入样例2
5 3
-100000
-100000
-2
-100000
-100000
输出样例2
-999999829
⭐思路:分情况讨论 + 双指针
🐷 k == n
🥚 没得选
🐷 k < n
🥚 k 为奇数
① 有正数,取一个最大的正数,其他按 乘积大小的取数对
② 无正数,按乘积最小取
🥚 k 为偶数
① 依次取乘积大的数对
🤠 大佬点睛
👨🏫 友情提示:需要比较的数不能取模,不然会影响比较的结果(细节取模)
😋 只要预先处理了一个数,奇数个 就 转变成 偶数个 的问题啦
import java.util.*;
public class Main
{
static int N = 100010;
static int mod = 1000000009;
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; i++)
{
a[i] = sc.nextInt();
}
int l = 0;
int r = n - 1;
long res = 1;
int sign = 1;// 记录结果的正负
Arrays.sort(a);// 默认升序
if (k % 2 == 1)//预先处理 k 为 奇数 的情况
{
res = a[r--];// 取出最大的数(有可能是负数)
k--;
if (res < 0)
sign = -1;// 最大值是负数,所有数都是负数,而且是奇数个,所以结果也是负数
}
while (k != 0)
{
// 两边都是成对成对的取,因为 while 里边 k 肯定是 偶数
long x = (long) a[l] * a[l + 1];
long y = (long) a[r] * a[r - 1] ;
//要比较,所以不能预先取模了
if (x * sign > y * sign)
{
res = x % mod * res % mod;// == (x*res)%mod 分开取模可以保证相乘的过程爆 long
l += 2;
k -= 2;
} else
{
res = y % mod * res % mod;
r -= 2;
k -= 2;
}
}
System.out.println(res);
}
}