应该是最水的一题
我还以为要用DP 我不会啊
排序一下
正数直接乘
负数两两配对乘(从最小负数开始走,得到的乘积最大)
0不要乘
最后特判下
不知道是不是因为上一场 题目变简单了
代码如下:
//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <algorithm>
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
#define fo1(a,b) for(int a=0;a<b;++a)
#define fo2(a,b) for(int a=1;a<=b;++a)
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=1e5+5;
const int mod=1e9+7;
ll a[70];
bool cmp(int a,int b){return a>b;}
int main()
{
int t,n;
cin>>t;
while(t--){
cin>>n;
int cnt=0;
fo2(i,n){
scanf("%lld",&a[i]);
if(a[i]<0)
cnt++;
}
if(cnt%2==1)
cnt--;
sort(a+1,a+1+n,cmp);
ll ans=1;
bool flag=0;
fo2(i,n){
if(a[i]>0)
ans*=a[i],flag=1;
else if(a[i]==0||a[i]<0)
break;
}
for(int i=n;i>=1;--i){
if(cnt==0)
break;
ans*=a[i],flag=1;
cnt--;
}
if(flag)
printf("%lld\n",ans);
else{
ll maxx=-1e9;
fo2(i,n)
maxx=max(maxx,a[i]);
printf("%lld\n",maxx);
}
}
return 0;
}