有正数和负数两种,可能两个负数的成绩大于两个正数的成绩,所以从小到大排序后双指针扫描,注意只有m>=2时才能选两个负数
#include <bits/stdc++.h>
using namespace std;
int a[111];
int main(){
int T;cin>>T;
while (T--) {
int n,m;cin>>n>>m;
for (int i = 0; i < n; i++) {
cin>>a[i];
}
sort(a,a+n);
if(m == 1) {
cout<<a[n - 1]<<endl;continue;
}
int res = 1;
for (int i = n - 1,j = 0;j <= i;) {
if(m == 0) break;
if(a[i] * a[i - 1] > a[j] * a[j + 1]) {
res *= a[i--];
m--;
} else {
if (m >= 2) {
res *= a[j] * a[j + 1];
m -= 2;
j += 2;
} else {
res *= a[i];
m--;
i--;
}
}
}
cout<<res<<endl;
}
return 0;
}