当前位置: 代码迷 >> 综合 >> 0006:最大乘积
  详细解决方案

0006:最大乘积

热度:43   发布时间:2024-01-15 07:38:53.0

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;}}}
}