问题描述
给出N个整数。你要选择至少一个数,使得你选的数的乘积最大。
保证任意选一些数相乘的绝对值都不会大于263−12^{63}-1263−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
考虑了很多情况才AC了

1 #pragma comment(linker, "/STACK:1024000000,1024000000") 2 #include<iostream> 3 #include<cstdio> 4 #include<cstring> 5 #include<cmath> 6 #include<math.h> 7 #include<algorithm> 8 #include<queue> 9 #include<set> 10 #include<bitset> 11 #include<map> 12 #include<vector> 13 #include<stdlib.h> 14 #include <stack> 15 using namespace std; 16 #define PI acos(-1.0) 17 #define max(a,b) (a) > (b) ? (a) : (b) 18 #define min(a,b) (a) < (b) ? (a) : (b) 19 #define ll long long 20 #define eps 1e-10 21 #define MOD 1000000007 22 #define N 100 23 #define inf 1e12 24 ll n; 25 ll a[N]; 26 bool cmp(ll a,ll b){ 27 return abs(a)>abs(b); 28 } 29 int main() 30 { 31 ll t; 32 scanf("%I64d",&t); 33 while(t--){ 34 scanf("%I64d",&n); 35 ll fu=0; ll zheng=0; ll zero=0; 36 ll num=1; 37 for(ll i=0;i<n;i++){ 38 scanf("%I64d",&a[i]); 39 if(a[i]>0){ 40 zheng++; 41 num*=a[i]; 42 }else if(a[i]<0){ 43 fu++; 44 }else { 45 zero++; 46 } 47 } 48 sort(a,a+n,cmp); 49 if(zheng==n){ 50 ll ans=1; 51 for(ll i=0;i<n;i++){ 52 ans*=a[i]; 53 } 54 printf("%I64d ",ans); 55 continue; 56 } 57 if(fu==n){ 58 if(fu==1){ 59 printf("%I64d ",a[0]); 60 }else{ 61 ll ans=1; 62 if(fu%2==0){ 63 for(ll i=0;i<n;i++){ 64 ans=ans*a[i]; 65 } 66 }else{ 67 for(ll i=0;i<n-1;i++){ 68 ans=ans*a[i]; 69 } 70 } 71 printf("%I64d ",ans); 72 } 73 continue; 74 } 75 if(zero==n){ 76 printf("0 "); 77 continue; 78 } 79 80 81 ll ans=num; 82 if(zheng==0 && zero!=0 && fu==1){ 83 ans=0; 84 } 85 86 ll z; 87 if(fu%2==1){ 88 z=fu-1; 89 }else { 90 z=fu; 91 } 92 ll c=0; 93 for(ll i=0;i<n;i++){ 94 if(c<z){ 95 if(a[i]<0){ 96 c++; 97 ans*=a[i]; 98 } 99 }else{ 100 break; 101 } 102 } 103 printf("%I64d ",ans); 104 105 } 106 return 0; 107 }