HDU 5504 GT and sequence 模拟

给一串整数数字a[0] , a[1].....a[n] (a[i]<2^63-1),任意挑选出一个或一个以上的数,问怎样挑选出的数乘积最大。

模拟:

如果a[i]>0;直接乘;

如果a[i]==0 不乘;

如果a[i]<0 如果小于0的个数为偶数全乘,为奇数最大的负数(即绝对值最小)不乘。

特判两个情况:n==1 && a[0]<0 答案为a[0] ;数组a只含一个负数,然后其他都为0,答案为0;

题目思路不难想到,但是两个特判的情况容易遗漏;以后做这种题目要头脑冷静,也不要过分贪快,敲代码要准确而快速。

还有一个疑问:a[i]是<2^63-1;为什么乘积不会超过long long 范围。

原文:It guaranteed that **the absolute value of** any product of the numbers you choose in the initial sequence will not bigger than 。

难道是我英文不好。。流泪。。

<span style="font-size:18px;">#include <cstdio>
#include <algorithm>
using namespace std;
#define maxx(a,b) ((a>b)?a:b)
long long a[100];
int main()
{
    int T,n,i;
    long long ans;
    scanf("%d",&T);
    while(T--)
    {
        ans=1;
        scanf("%d",&n);
        for(i=0;i<n;i++)
            scanf("%lld",&a[i]);
        if(n==1 && a[0]<0)
        {
            printf("%lld\n",a[0]);
            continue;
        }
        sort(a,a+n);
        int k1=0,k2=-1,k3=-1;
        for(i=0;i<n;i++)
        {
            if(a[i]<0)
                k1=i+1;
            else if(k2==-1 && a[i]==0)
                k2=i;
            else if(a[i]>0)
            {
                k3=i;
                break;
            }
        }
        if(k1!=0 && k3!=-1)
        {
            if(k1&1)
            {
                for(i=0;i<k1-1;i++)
                    ans*=a[i];
                for(i=k3;i<n;i++)
                    ans*=a[i];
            }
            else
            {
                for(i=0;i<k1;i++)
                    ans*=a[i];
                for(i=k3;i<n;i++)
                    ans*=a[i];
            }

        }
        else if(k1!=0 && k3==-1)
        {
            if(k1&1)
            {
                for(i=0;i<k1-1;i++)
                    ans*=a[i];
            }
            else
            {
                for(i=0;i<k1;i++)
                    ans*=a[i];
            }
        }
        else if(k1==0)
            for(i=k3;i<n;i++)
                ans*=a[i];
        if(k2!=-1 && k3==-1 && k1==1)
            ans=maxx(ans-1,0);
        printf("%lld\n",ans);
    }
    return 0;
}
</span>



你可能感兴趣的:(HDU 5504 GT and sequence 模拟)