0006:最大乘积

总时间限制: 

1000ms

 

内存限制: 

65536kB

描述

给定一个整数数组,我们希望去掉其中一个数,使得剩下所有数的乘积最大,问应该去掉哪一个数

输入

第一行M,表示有M组数据
接下来2*M行,每两行表示一组测试数据,每组的第一行市一个整数N,表示是数组的长度,接下来一行有N个整数,表示数组的内容,3<=N<=100,且数组内每个数都在[-10000000,10000000]区间内.

输出

M行,每行一个整数,表示应该去掉的那个数,如果有多个选择,则输出最先输入的那个.

样例输入


4 3 0 1 2 5 2 3 5 4 8 5 -1 -2 -3 -4 -5 4 -1 -2 -3 -4


样例输出


0 2 -1 -4


题目分析:

这题是只要是受0的影响和负数的影响,我想的是用flag计算0的个数,用sum计算剩下不为0的数的累积乘,然后分别判断。

首先,0只要>=2,乘积最大就是0,直接输出第一个就行。

然后,如果sum>0,

1.如果有一个0,则直接删除0即可。

2.如果没有0,sum>0则说明负数为偶数(可能为0),如果没有正数,则输出最小负数

                                                                          如果有正数,则输出最小正数。

如果sum<0;

1.如果有一个0,删除第一个不为0的数,不是第一个就是第二个

2.如果没有0,sum<0则说明负数为奇数,直接输出最大负数。

思路是没错的但是有一点,sum可能会超范围,java的long都不够,就一直无限wrong ,其实这里sum就一点判断负数的个数的,所以,我们直接如果a[i]<0,sum*=-1,效果是一样的,其实该统计负数的个数的,但都一样。

java代码实现:

import java.io.*;
import java.util.*;


public class Main {
public static void main(String args[])
{

Scanner cin = new Scanner(System.in);
while(cin.hasNext())
{
int t=cin.nextInt();

while(t-->0)
{
int n=cin.nextInt();
//cin.nextLine();
int[] a = new int[105];
long sum=1;
int flag=0;
int minn1=10000005;
int minn2=10000005;
int maxx=-10000005;
for(int i=1;i<=n;i++)
{
a[i]=cin.nextInt();
if(a[i]==0)
flag++;
if(a[i]>0)
minn1=Math.min(a[i],minn1);
if(a[i]<0)
{
sum*=-1;
minn2=Math.min(a[i],minn2);
maxx=Math.max(maxx, a[i]);
}

}

if(flag>=2)
{
System.out.println(a[1]);
}
else if(sum>=0)
{

if(flag==1)
System.out.println(0);
else
{
if(minn1==10000005)
System.out.println(minn2);
else
System.out.println(minn1);

}
}
else
{
if(flag==1)
{
if(a[1]==0)
{
System.out.println(a[2]);
}
else
System.out.println(a[1]);
}

else
{
System.out.println(maxx);
}
}

}
}
}
}

c++代码实现:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
//cin.nextLine();
int a[105];
int flag=0;
long long sum=1;
int minn1=10000005;
int minn2=10000005;
int maxx=-10000005;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(a[i]==0)
flag=1;

if(a[i]>0)
minn1=min(a[i],minn1);
if(a[i]<0)
{
sum*=-1;
minn2=min(a[i],minn2);
maxx=max(maxx, a[i]);
}


}
if(sum>=0)
{
if(flag==1)
cout<<0<<endl;
else
{
if(minn1==10000005)
cout<<minn2<<endl;
else
cout<<minn1<<endl;

}
}
else
{
if(flag==1)
{
for(int i=1;i<=n;i++)
if(a[i]!=0)
{
cout<<a[i]<<endl;
break;
}
}

else
{
cout<<maxx<<endl;
}
}

}
}