zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    计算机网络杂烩
    网络体系、网络模型其他
    数据通信(系统)的物理要素
    数据通信历史
    没有备案的网站域名能解析吗
    dedecms列表页有图调用缩略图无图留空的方法
    dede 你所上传的软件类型不在许可列表,请更改系统对扩展名限定的配置
    跟版网 > 织梦教程 > 织梦安装使用 > 织梦DedeCMS附件上传大
    从#65279字符看dede模板页面编码问题
    sublime text如何保存为uft-8无bom编码格式文件
  • 原文地址:https://www.cnblogs.com/PersistFaith/p/4932349.html
Copyright © 2011-2022 走看看