题目地址:​​点击打开链接​

思路:看着是水题,坑还是比较多的,(1)如果有正数,那么正数的全乘起来,如果还有超过2个的负数再乘以偶数个最小的负数,直到不能乘为止(2)如果只有超过2个的负数,则乘以偶数个最小的负数,直到不能乘为止(2)如果只有一个负数或没有负数,如果有0,输出0,没零,那就输出负数

AC代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>
#include <cctype>

using namespace std;

__int64 a[70],b[70];

int main()
{
int t,n;
int i;
scanf("%d",&t);
while(t--)
{
int positive = 0,zero = 0,negative = 0;
__int64 sum = 1,x;
scanf("%d",&n);
for(i=0; i<n; i++)
{
scanf("%I64d",&x);
if(x > 0)
{
positive++;
a[positive] = x;
}
else if(x == 0)
{
zero++;
}
else
{
negative++;
b[negative] = x;
}
}
sort(b+1,b+negative+1);//注意第二个参数,wrong了无数发,是negative,不是n
if(positive)
{
for(i=1; i<=positive; i++)
{
sum *= a[i];
}
for(i=1; i<=negative/2; i++)
{
sum *= b[2*i-1] * b[2*i];
}
printf("%I64d\n",sum);
continue;
}
if(negative > 1)
{
for(i=1; i<=negative/2; i++)
{
sum *= b[2*i-1] * b[2*i];
}
printf("%I64d\n",sum);
}
else
{
if(zero)
printf("0\n");
else
printf("%I64d\n",b[1]);
}
}
return 0;
}