hdu 5504 GT and sequence

问题描述

给出NNN个整数。你要选择至少一个数,使得你选的数的乘积最大。
保证任意选一些数相乘的绝对值都不会大于263−12^{63}-12?63??−1。

输入描述

第一行读入一个数TTT表示数据组数。
对于每组数据:
第一行是一个数NNN,第二行是NNN个整数。

1≤T≤10001 \leq T \leq 10001≤T≤1000
1≤N≤621 \leq N \leq 621≤N≤62

hack时建议输出最后一行的行末回车;每一行的结尾不要输出空格。

输出描述

对于每组数据,输出一个数表示最大的乘积。

输入样例

1
3
1 2 3

输出样例

6

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

INPUT11-1OUTPUT-1

INPUT121 -1OUTPUT1

INPUT130 0 0OUTPUT0

INPUT13-1 0 0OUTPUT0

INPUT13-1 0 2OUTPUT2

INPUT15-2 -3 2 4 1OUTPUT48

INPUT15-2 -3 -5 4 2OUTPUT120
#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\n", ans);
    }
    return 0;
}
时间: 2024-08-04 03:19:52

hdu 5504 GT and sequence的相关文章

HDU 5783 Divide the Sequence(数列划分)

HDU 5783 Divide the Sequence(数列划分) Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)   Problem Description - 题目描述 Alice has a sequence A, She wants to split A into as much as possible continuous subsequences, satisfy

HDU 5063 Operation the Sequence(暴力)

HDU 5063 Operation the Sequence 题目链接 把操作存下来,由于只有50个操作,所以每次把操作逆回去运行一遍,就能求出在原来的数列中的位置,输出即可 代码: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; const int N = 100005; const ll MOD = 100000

hdu 4893 Wow! Such Sequence!(线段树)

题目链接:hdu 4983 Wow! Such Sequence! 题目大意:就是三种操作 1 k d, 修改k的为值增加d 2 l r, 查询l到r的区间和 3 l r, 间l到r区间上的所以数变成最近的斐波那契数,相等的话取向下取. 解题思路:线段树,对于每个节点新增一个bool表示该节点以下的位置是否都是斐波那契数. #include <cstdio> #include <cstring> #include <cstdlib> #include <algor

HDU Wow! 4893 Such Sequence!(线段树)

HDU 4893 Wow! Such Sequence! 题目链接 题意:给定一个序列,3种操作,单点添加值,查询区间和,把区间和变成最接近的婓波那契数 思路:线段树,就是第三个操作麻烦,就在结点添加一个值,标记它区间是不是都是婓波那契数了,然后修改区间的时候,如果区间是了就不用修改,如果不是就继续往后一层推即可 代码: #include <cstdio> #include <cstring> #include <cstdlib> #define lson(x) ((x

HDU 4893 Wow! Such Sequence! 水线段树

思路: 线段树走起.. 写完这题就退役T^T 单点更新的时候直接找到这个点的最近fib,然后维护当前和 和 fib的和 #include<stdio.h> #include<string.h> #include<iostream> #include<math.h> #include<algorithm> #include<queue> #include<map> #include<set> #include&l

hdu 4893 Wow! Such Sequence!(线段树功能:单点更新,区间更新相邻较小斐波那契数)

转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4893 --------------------------------------------------------------------------------------------------------------------------------------------

HDU 4893 Wow! Such Sequence! (线段树)

Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 838    Accepted Submission(s): 245 Problem Description Recently, Doge got a funny birthday present from his new friend, Prot

HDU 5288 OO’s Sequence (暴力枚举因子)

题目链接:HDU 5288 OO's Sequence 题意:给出一个n,表示n个数的序列,函数f(l,r)定义,在l,r区间中存在多少个数,不能被其他数整除.求累加所有子区间的函数值 思路:从ai的小范围入手 1.a不能被b整除,即a的所有因子中不存在b,所以打表枚举所有的数的因子. 2.找到一个数(位置为i)满足条件时最左端l和最右端r,(i-l)*(r-i)就是对答案的贡献. AC代码: #include <stdio.h> #include <algorithm> #inc

判断相同区间(lazy) 多校8 HDU 5828 Rikka with Sequence

1 // 判断相同区间(lazy) 多校8 HDU 5828 Rikka with Sequence 2 // 题意:三种操作,1增加值,2开根,3求和 3 // 思路:这题与HDU 4027 和HDU 5634 差不多 4 // 注意开根号的话,遇到极差等于1的,开根号以后有可能还是差1.如 5 // 2 3 2 3... 6 // 8 9 8 9... 7 // 2 3 2 3... 8 // 8 9 8 9... 9 // 剩下就是遇到区间相等的话,就直接开根号不往下传 10 11 12