最大乘积

xiaoxiao2021-02-28  91

给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大 输入描述: 无序整数数组A[n] 输出描述:

满足条件的最大乘积

 

思路:

这个可以分类讨论下

(1)三个数都是正数,找最大的三个正数

(2)两个正数一个负数,最小的两个正数和最大的一个负数

(3)一个正数两个负数,最小的两个负数,和最大的一个正数

(4)三个都是负数,找最大的三个负数

(5)取到零,结果就是为零

代码:

 

#include <stdio.h> #include <iostream> #include <vector> #include <algorithm> using namespace std; typedef long long int ll; ll a[100010]; vector<ll> p; vector<ll> ne; vector<ll> zero; int cmp(ll a1, ll a2){ return a1>a2; } int main(){ int n; ll ans=-20000000000000000; scanf("%d", &n); for(int i=0; i<n; i++){ cin>>a[i]; } for(int i=0; i<n; i++){ if(a[i]>0){ p.push_back(a[i]); } else if(a[i]<0){ ne.push_back(a[i]); } else{ zero.push_back(a[i]); } } sort(p.begin(), p.end()); sort(ne.begin(), ne.end()); sort(zero.begin(), zero.end()); int ph=p.size(), neh=ne.size(), z=zero.size(); if(ph>=3){ ans=max(p[ph-1]*p[ph-2]*p[ph-3], ans); } if(ph>=2&&neh>=1){ ans=max(ans, p[0]*p[1]*ne[neh-1]); } if(z>0){ ans=max(ans, (ll)0); } if(ph>=1&&neh>=2){ ans=max(ans, p[ph-1]*ne[0]*ne[1]); } if(neh>=3){ ans=max(ans, ne[neh-1]*ne[neh-2]*ne[neh-3]); } //printf("%lld\n", ans); cout<<ans<<endl; return 0; }

 

 

 

 

 

转载请注明原文地址: https://www.6miu.com/read-85013.html

最新回复(0)