思路:先排序,分类讨论:
1.若k==n时,都相乘。
2.当k<n 时,若k为偶数,则每次找一对正数或一对负数,看哪一对的乘积打就选哪个
若k为奇数,则看序列中有无非负数,若有,则答案一定为正,先选上最大非负整数,再同上一对一对选数据。若无非负数,则结果为负,选绝对值最小的k个数的乘积。
AC代码:
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN = 100005;
const int MOD = 1000000009;
typedef long long ll;
ll n,k;
ll a[MAXN];
ll l,r;
ll ans=1;
int main()
{
cin>>n>>k;
for(int i=0;i<n;++i) cin>>a[i];
sort(a,a+n);
if(k==n)
{
for(int i=0;i<n;++i) ans=(ans*a[i])%MOD;
}
else if(k<n)
{
if(k%2==0)
{
l=0,r=n-1;
for(int i=0;i<k/2;i++)
{
if(a[l]*a[l+1]>a[r]*a[r-1])
{
ans=(ans*a[l])%MOD;
ans=(ans*a[l+1])%MOD;
l+=2;
}
else
{
ans=(ans*a[r])%MOD;
ans=(ans*a[r-1])%MOD;
r-=2;
}
}
}
else
{
if(a[n-1]<0)
{
for(int i=1;i<=k;++i)
{
ans=(ans*a[n-i])%MOD;
}
}
else
{
ans=a[n-1];
l=0,r=n-2;
for(int i=0;i<k/2;i++)
{
if(a[l]*a[l+1]>a[r]*a[r-1])
{
ans=(ans*a[l])%MOD;
ans=(ans*a[l+1])%MOD;
l+=2;
}
else
{
ans=(ans*a[r])%MOD;
ans=(ans*a[r-1])%MOD;
r-=2;
}
}
}
}
}
cout<<ans<<endl;
return 0;
}