问题描述
给出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-10-10 09:25:35