题目分析
对于该题目乍一看很简单,因为情况太多了所以它其实并没有那么简单,如果让我自己来做这道题目,我觉得我应该不能全部AC,因为情况很多我可能会罗列很多的if else语句,最后弄的一团糟,我知道他肯定得分类,我刚开始想按照a进行分类,a全为负数,全为整数,但是对于既有正数又有负数的形式我不知道该如何去操作。其实这也是核心的地方,就是y总讲的知识,按照k的奇偶数进行分类。
1. 1)k是奇数
a. 全部为负数—>res为负,(注意:如果k < n ,那么要从坐标轴的右边开始取值!!!)
b. 不全部为负数---->res为正,保存最大值,k–,k为偶数—>回到k是偶数的情况
2. 2)k是偶数
a. 负数为偶数个---->res为正,
b. 负数为奇数个---->res为正,
代码
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int a[N];
typedef long long ll;
const int Q=1000000009;
int main(){
int n,k;
cin>>n>>k;
for(int i=0;i<n;i++){
cin>>a[i];
}
sort (a,a+n);
ll res=1;
int l=0,r=n-1;
int flag=1;
if(k&1){
res=a[r];
r--;
k--;
if(res<0){
flag=-1;//标志全为1
}
}
while(k){
ll sum1=(ll)a[l]*a[l+1];
ll sum2=(ll)a[r]*a[r-1];
if(sum1*flag>sum2*flag){// *这里为什么要*flag一定要搞明白!!!!*
res=(ll)sum1%Q*res%Q; //这里一定要每次都%Q,并且一定是sum在前!!!,因为sum的可以取到10^10,
//如果不立即%,那么和后边的res相乘后会爆long long ,long long 的取值范围为10^18;如果先乘res,还是会爆long long 呀!!,res在前边因为已经%Q了,所以取值一定在10^9内,所以这里res在前边还%Q其实没用!!!!
l=l+2;
}
else{
res=(ll)sum1%Q*res%Q;
r=r-2;
}
k=k-2;
}
cout<<res;
return 0;
}