题意
给定 N N N 个数,要求从中挑选至少 1 1 1个数使它的乘积是所有可能结果中最大的。
思路
分两种情况
- 正数
正数的话直接输出即可 - 非正数(0和负数)
a. 负数
因为负负得正,所以只有找出绝对值最大的那偶数个负数即可。
b.0
0的条件比较苛刻。首先必须满足数列中没有正数,且负数的个数 ≤ 1 \le1 ≤1.(只有满足这些情况,0才有可能为最大乘积)。
代码
#include<bits/stdc++.h>
#include<cstring>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#include<map>
#define ll long long
using namespace std;
const int N=1e5+10;
const int M=2023;
const int inf=0x3f3f3f3f;
int n,a[N],b[N];
int num;
int zero,f;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
if(n==1)
{
cout<<a[1];
return 0;
}
for(int i=1;i<=n;i++)
{
if(a[i]>0)cout<<a[i]<<" ";
if(a[i]>0)zero++;
if(a[i]<0)f++;
}
for(int i=1;i<=n;i++)
{
if(a[i]<0)
{
num++;
b[num]=a[i];
}
if(a[i]==0 and !zero and f<=1)
{
num++;
b[num]=a[i];
}
}
sort(b+1,b+num+1);//从小到大排序
if(num%2==1)//负数的个数为奇数
{
for(int i=1;i<num;i++)cout<<b[i]<<" ";
}
else//偶数
{
for(int i=1;i<=num;i++)cout<<b[i]<<" ";
}
return 0;
}
AC记录.