0006:最大乘积
原创
©著作权归作者所有:来自51CTO博客作者mb5f5b1df7f1e34的原创作品,请联系作者获取转载授权,否则将追究法律责任
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;
}
}
}
}