HDU 5504:GT and sequence

GT and sequence

 
 Accepts: 95
 
 Submissions: 1467
 Time Limit: 2000/1000 MS (Java/Others)
 
 Memory Limit: 65536/65536 K (Java/Others)
问题描述
给出NN个整数。你要选择至少一个数,使得你选的数的乘积最大。
保证任意选一些数相乘的绝对值都不会大于2^{63}-12631
输入描述
第一行读入一个数TT表示数据组数。
对于每组数据:
第一行是一个数NN,第二行是NN个整数。

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

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

比的时候本来打算写一个刚学的深搜,结果最后TLE了。。。。

TLE代码:

#include <iostream>  
#include <algorithm>  
#include <cmath>  
#include <vector>  
#include <string>  
#include <cstring>  
#pragma warning(disable:4996)  
using namespace std;

int test;
long long n, a[70], ans, flag;

void dfs(long long i, long long mul)
{
    if (i == n + 1)
    {
        if (flag == 0 && mul == 1)
        {
            flag = 1;
        }
        else
        {
            ans = max(ans, mul);
        }
        return;
    }
    dfs(i + 1, mul);
    dfs(i + 1, mul*a[i]);
}

int main()
{
    //freopen("i.txt", "r", stdin);
    //freopen("o.txt", "w", stdout);

    int i;
    scanf("%d", &test);

    while (test--)
    {
        flag = 0;
        scanf("%I64d", &n);

        i = 1;
        for (i = 1; i <= n; i++)
            scanf("%I64d", &a[i]);
        sort(a + 1, a + n + 1);

        ans = a[n];
        dfs(1, 1);

        cout << ans << endl;
    }

    //system("pause");
    return 0;
}


最后规规矩矩考虑各种情况,很麻烦的一道题。。。。负数是奇数个的时候不要最大的那个。。。

代码:

#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#include <ctime>
#pragma warning(disable:4996)
using namespace std;

long long po[900], ne[900];
long long n, num_ne, num_po;

bool cmp(long long x, long long y)
{
    return x > y;
}

int main()
{


    long long test, flag0, i, x, ans;
    scanf("%I64d", &test);

    while (test--)
    {
        num_ne = 0;
        num_po = 0;
        flag0 = 0;
        memset(po, 0, sizeof(po));
        memset(ne, 0, sizeof(ne));

        scanf("%I64d", &n);

        for (i = 1; i <= n; i++)
        {
            scanf("%I64d", &x);
            if (x > 0)
            {
                po[num_po++] = x;
            }
            else if (x < 0)
            {
                ne[num_ne++] = x;
            }
            else
            {
                flag0 = 1;
            }
        }
        sort(po, po + num_po);
        sort(ne, ne + num_ne,cmp);

        if (flag0)
        {
            if (num_po > 0)
            {
                ans = 1;
                for (i = 0; i < num_po; i++)
                {
                    ans = ans*po[i];
                }
                if (num_ne % 2)
                {
                    for (i = 1; i < num_ne; i++)
                    {
                        ans = ans*ne[i];
                    }
                }
                else
                {
                    for (i = 0; i < num_ne; i++)
                    {
                        ans = ans*ne[i];
                    }
                }
            }
            else
            {
                //没有正数的情况
                if (num_ne == 0)
                {
                    ans = 0;
                }
                else if (num_ne == 1)
                {
                    ans = 0;
                }
                else
                {
                    ans = 1;
                    if (num_ne % 2)
                    {
                        for (i = 1; i < num_ne; i++)
                        {
                            ans = ans*ne[i];
                        }
                    }
                    else
                    {
                        for (i = 0; i < num_ne; i++)
                        {
                            ans = ans*ne[i];
                        }
                    }
                }
            }
        }
        else
        {
            if (num_po > 0)
            {
                ans = 1;
                for (i = 0; i < num_po; i++)
                {
                    ans = ans*po[i];
                }
                if (num_ne % 2)
                {
                    for (i = 1; i < num_ne; i++)
                    {
                        ans = ans*ne[i];
                    }
                }
                else
                {
                    for (i = 0; i < num_ne; i++)
                    {
                        ans = ans*ne[i];
                    }
                }
            }
            else
            {
                //没有正数的情况
                if (num_ne == 0)
                {
                    ans = 0;
                }
                else if (num_ne == 1)
                {
                    ans = ne[0];
                }
                else
                {
                    ans = 1;
                    if (num_ne % 2)
                    {
                        for (i = 1; i < num_ne; i++)
                        {
                            ans = ans*ne[i];
                        }
                    }
                    else
                    {
                        for (i = 0; i < num_ne; i++)
                        {
                            ans = ans*ne[i];
                        }
                    }
                }
            }
        }

        cout << ans << endl;
    }
    return 0;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

posted on 2015-10-18 16:47  光速小子  阅读(170)  评论(0编辑  收藏  举报

导航