题目
解释
- N个数中选K个数
- 对于K进行讨论
- 如果K==N的话
- 全选
- 如果K<N的话
- 如果K是偶数的话
- 总是可以选出K个非负数,因此从开头和末尾各选择一对对较大的数
- 如果K是奇数的话
- 如果N中全是负数
- 首先选择最大的负数
- 再从开头和末尾比较选择当前较小的一对数(用sign标记正负)
- 如果N中至少有一个非负数
- 那么那么选择这个非负数
- 然后同k为偶数的做法
代码段
#include<bits/stdc++.h>
using namespace std;
const int mod=1000000009;
#define ll long long
const int N=1e5+10;
ll a[N];
int n,k;
int main()
{
cin>>n>>k;
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);
ll res=1;
int sign=1;
int l=0,r=n-1;
if(k&1)
{
res*=a[r--];
k--;
if(res<0)
sign=-1;
}
while(k)
{
ll x=a[l]*a[l+1],y=a[r]*a[r-1];
if(x*sign>y*sign)
{
res=x%mod*res%mod;
l+=2;
}
else
{
res=y%mod*res%mod;
r-=2;
}
k-=2;
}
cout<<res<<endl;
}