JavaStudy——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

Accepted代码

import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		while(in.hasNext()) {
			int M=in.nextInt();
			while(M-->0) {
				int N=in.nextInt();
				int[] arr=new int[N];
				long sum=1;//不为0的数的乘积
				int flag=0;
				int min1=10000001;
				int min2=10000001;
				int max=-10000001;
				for (int i=0;i<N;i++) {
					arr[i]=in.nextInt();	
					if(arr[i]==0)
						flag++;//统计0的个数
					if(arr[i]>0)
						min1=Math.min(arr[i],min1);
					if(arr[i]<0) {
						sum*=-1;
						min2=Math.min(arr[i],min2);
						max=Math.max(max, arr[i]);
					}
				}
				if(flag>=2)
					System.out.println(arr[0]);
				//如果0的个数>=2,则输出第一个数
				else if(sum>=0) {
					if(flag==1) System.out.println(0);
					//如果有一个0,则输出0
					else {
						if(min1==10000001)
							System.out.println(min2);
						else
							System.out.println(min1);
					}
				}
				else {
					if(flag==1) {
						if(arr[0]==0)
							System.out.println(arr[1]);
						else
							System.out.println(arr[0]);
					}
					else
						System.out.println(max);
				}
			}
		}
		in.close();
	}
}

PS:emmm…这道题其实我觉得还是用BigInteger类暴力枚举好写,这样分类讨论虽然易于理解 但实在是太绕。小小的算了下,大概有10+种情况。不光要考虑0的个数 还得考虑负数对最后成绩的影响 晕Orz,具体代码实现凑合着看吧。。。

你可能感兴趣的:(OpenJudge,-,javastudy)