hdu 5504 GT and sequence

问题描述
给出N个整数。你要选择至少一个数,使得你选的数的乘积最大。
保证任意选一些数相乘的绝对值都不会大于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

考虑了很多情况才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\n",ans);
 55            continue;
 56        }
 57        if(fu==n){
 58           if(fu==1){
 59              printf("%I64d\n",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\n",ans);
 72           }
 73           continue;
 74        }
 75        if(zero==n){
 76           printf("0\n");
 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\n",ans);
104 
105    }
106     return 0;
107 }
View Code

 

posted @ 2015-10-29 19:08  UniqueColor  阅读(206)  评论(0编辑  收藏  举报