• 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;
    }



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

  • 相关阅读:
    弹窗
    ajax
    Jquery元素选取、常用方法
    PDO
    session的使用
    投票练习题
    php 批量删除
    php 连接数据库的增删改查
    面向对象的加载类和设计模式
    面向对象三大特性
  • 原文地址:https://www.cnblogs.com/lightspeedsmallson/p/4899511.html
Copyright © 2020-2023  润新知