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);elseSystem.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;elsecout<<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;}}}
}