#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long LL;
const int N = 100010, mod = 1000000009;//十位数
int a[N];
int n, k;
int main()
{
scanf("%d%d",&n,&k);//n个数里调k个
//主角登场
for(int i = 0;i < n;i ++) scanf("%d",&a[i]);
sort(a, a + n);
//上边的都是基操
int res = 1;//放答案
//l是第一个数的下标,r是最后一个数的下标
int l = 0, r = n - 1;
int sign = 1;//表示正数
//k为1,表示就选一个,找到一个最大的即可,将跳过此处;
//k不为1,res将存放最后一个元素,r指针前移一位,
//且若res现在为负数,sign标志转换为-1,表示负数
//已经挑走一个,k--,表明,只要k不是1,最后一个数是志在必得的
if(k & 1) {//k是1,就为0;k不是1,就为1
res = a[r --];
if(res < 0) sign = -1;
k --;
}
//当k不为0时,执行内部循环
while(k) {
//x和y开始挑人了,前提:以前从来没用到过
//x表示前两个数相乘,y表示后两个数相乘
LL x = (LL)a[l] * a[l + 1], y = (LL)a[r - 1] * a[r];
//如果左操作数大于右操作数
if(x * sign > y * sign) {
//就让x与res相乘,并取模
res = x * res % mod;
//左指针后移两位
l += 2;
}else {
//如果右操作数大于左操作数
//就让y和res相乘,并取模
res = y * res % mod;
//右指针前移两位
r -= 2;
}
//调完两个数,k减2
k -= 2;
}
printf("%d\n",res);
return 0;
}
蓝桥杯_乘积最大
最新推荐文章于 2024-07-19 23:11:36 发布