hdu 5504 GT and sequence

问题描述
给出NNN个整数。你要选择至少一个数,使得你选的数的乘积最大。
保证任意选一些数相乘的绝对值都不会大于263−12^{63}-1263​​1。
输入描述
第一行读入一个数TTT表示数据组数。
对于每组数据:
第一行是一个数NNN,第二行是NNN个整数。

1≤T≤10001 leq T leq 10001T1000
1≤N≤621 leq N leq 621N62

hack时建议输出最后一行的行末回车;每一行的结尾不要输出空格。
输出描述
对于每组数据,输出一个数表示最大的乘积。
输入样例
1
3
1 2 3
输出样例
6

这题就不多说了,就是坑比较多,出题人挖了这么多坑,只能由我们自己来填,与其说得再多,不如提供几组数据测试吧
INPUT
1
1
0
OUTPUT
0

INPUT
1
1
-1
OUTPUT
-1

INPUT
1
2
1 -1
OUTPUT
1

INPUT
1
3
0 0 0
OUTPUT
0

INPUT
1
3
-1 0 0
OUTPUT
0

INPUT
1
3
-1 0 2
OUTPUT
2

INPUT
1
5
-2 -3 2 4 1
OUTPUT
48

INPUT
1
5
-2 -3 -5 4 2
OUTPUT
120
#include<cstdio>
#include<cstring>
#include<stack>
#include<vector>
#include<queue>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
const int oo = 0x3f3f3f3f;
const int maxn = 1e6+7;
typedef long long LL;
int main()
{
    int T, n, i, k;
    ///fu,z分别代表负数以及正数的乘积
    ///fu_num,z_num分别代表负数以及正数的个数mini代表最大的负数
    LL z, fu, z_num, fu_num, num[888], ans, mini;
    scanf("%d", &T);
    while(T--)
    {
        ans = 1;k = 0;
        fu = z = 1; fu_num = z_num = 0;
        scanf("%d", &n);

        for(i = 1; i <= n; i++)
        {
            scanf("%lld", &num[i]);
            if(num[i] == 0)continue;
            if(num[i] < 0)
            {
                fu *= num[i], fu_num++;
                if(k)
                    mini = max(mini, num[i]);
                else mini = num[i];
                k++;
            }
            if(num[i] > 0) z *= num[i], z_num++;
        }
        if(z_num) ans = z;///先计算正数的积
        if(fu_num>1) ans *= fu;///如果负数个数大于1个乘上该乘积
        if(fu_num%2==1&&fu_num>1) ans /= mini;///如果负数个数大于1个且为奇数去除最大的负数
        if(fu_num<=1&&z_num==0) ans = 0;///没有正数且负数的个数小于2
        if(n == 1) ans = num[1];///只有一个数。。。
        printf("%lld
", ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/PersistFaith/p/4932349.html