Maximum sum of pairwise product in an array with negative allowed
Last Updated :
27 Jul, 2022
Given an array of n elements. Find maximum sum of pairwise multiplications. Sum can be larger so take mod with 10^9+7. If there are odd elements, then we can add any one element (without forming a pair) to the sum.
Examples:
Input : arr[] = {-1, 4, 5, -7, -4, 9, 0}
Output : 77
So to get the maximum sum, the arrangement will
be {-7, -4}, {-1, 0}, {9, 5} and {4}.
So the answer is (-7*(-4))+((-1)*0)+(9*5)+(4) ={77}.
Input : arr[] = {8, 7, 9}
Output : 79
Answer is (9*8) +(7) = 79.
Approach:
- Sort the given array.
- First, multiply the negative numbers pairwise from the starting and add to the total_sum.
- Second, multiply the positive numbers pairwise from the last and to the total_sum.
- Check if negative and positive both counts are odd, then add the product of last pair
i.e. last negative and positive left.
- Or if any of the one counts is odd, then add that element left.
- Return sum.
Implementation:
C++
#include <bits/stdc++.h>
#define Mod 1000000007
using namespace std;
long long int findSum( int arr[], int n)
{
long long int sum = 0;
sort(arr, arr + n);
int i = 0;
while (i < n && arr[i] < 0) {
if (i != n - 1 && arr[i + 1] <= 0) {
sum = (sum + (arr[i] * arr[i + 1]) % Mod) % Mod;
i += 2;
}
else
break ;
}
int j = n - 1;
while (j >= 0 && arr[j] > 0) {
if (j != 0 && arr[j - 1] > 0) {
sum = (sum + (arr[j] * arr[j - 1]) % Mod) % Mod;
j -= 2;
}
else
break ;
}
if (j > i)
sum = (sum + (arr[i] * arr[j]) % Mod) % Mod;
else if (i == j)
sum = (sum + arr[i]) % Mod;
return sum;
}
int main()
{
int arr[] = { -1, 9, 4, 5, -4, 7 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << findSum(arr, n);
return 0;
}
|
Java
import java.io.*;
import java.util.*;
class GFG {
static int Mod = 1000000007 ;
static long findSum( int arr[], int n) {
long sum = 0 ;
Arrays.sort(arr);
int i = 0 ;
while (i < n && arr[i] < 0 ) {
if (i != n - 1 && arr[i + 1 ] <= 0 ) {
sum = (sum + (arr[i] * arr[i + 1 ]) % Mod) % Mod;
i += 2 ;
}
else
break ;
}
int j = n - 1 ;
while (j >= 0 && arr[j] > 0 ) {
if (j != 0 && arr[j - 1 ] > 0 ) {
sum = (sum + (arr[j] * arr[j - 1 ]) % Mod) % Mod;
j -= 2 ;
} else
break ;
}
if (j > i)
sum = (sum + (arr[i] * arr[j]) % Mod) % Mod;
else if (i == j)
sum = (sum + arr[i]) % Mod;
return sum;
}
public static void main(String args[]) {
int arr[] = {- 1 , 9 , 4 , 5 , - 4 , 7 };
int n = arr.length;
System.out.println(findSum(arr, n));
}
}
|
Python3
Mod = 1000000007
def findSum(arr, n):
sum = 0
arr.sort()
i = 0
while i < n and arr[i] < 0 :
if i ! = n - 1 and arr[i + 1 ] < = 0 :
sum = ( sum + (arr[i] * arr[i + 1 ])
% Mod) % Mod
i + = 2
else :
break
j = n - 1
while j > = 0 and arr[j] > 0 :
if j ! = 0 and arr[j - 1 ] > 0 :
sum = ( sum + (arr[j] * arr[j - 1 ])
% Mod) % Mod
j - = 2
else :
break
if j > i:
sum = ( sum + (arr[i] * arr[j]) % Mod)
% Mod
elif i = = j:
sum = ( sum + arr[i]) % Mod
return sum
arr = [ - 1 , 9 , 4 , 5 , - 4 , 7 ]
n = len (arr)
print (findSum(arr, n))
|
C#
using System;
class GFG {
static int Mod = 1000000007;
static long findSum( int [] arr, int n)
{
long sum = 0;
Array.Sort(arr);
int i = 0;
while (i < n && arr[i] < 0) {
if (i != n - 1 && arr[i + 1] <= 0) {
sum = (sum + (arr[i] * arr[i + 1]) % Mod) % Mod;
i += 2;
}
else
break ;
}
int j = n - 1;
while (j >= 0 && arr[j] > 0) {
if (j != 0 && arr[j - 1] > 0) {
sum = (sum + (arr[j] * arr[j - 1]) % Mod) % Mod;
j -= 2;
}
else
break ;
}
if (j > i)
sum = (sum + (arr[i] * arr[j]) % Mod) % Mod;
else if (i == j)
sum = (sum + arr[i]) % Mod;
return sum;
}
public static void Main()
{
int [] arr = { -1, 9, 4, 5, -4, 7 };
int n = arr.Length;
Console.WriteLine(findSum(arr, n));
}
}
|
PHP
<?php
$Mod = 1000000007;
function findSum(& $arr , $n )
{
global $Mod ;
$sum = 0;
sort( $arr );
$i = 0;
while ( $i < $n && $arr [ $i ] < 0)
{
if ( $i != $n - 1 && $arr [ $i + 1] <= 0)
{
$sum = ( $sum + ( $arr [ $i ] *
$arr [ $i + 1]) % $Mod ) % $Mod ;
$i += 2;
}
else
break ;
}
$j = $n - 1;
while ( $j >= 0 && $arr [ $j ] > 0)
{
if ( $j != 0 && $arr [ $j - 1] > 0)
{
$sum = ( $sum + ( $arr [ $j ] *
$arr [ $j - 1]) % $Mod ) % $Mod ;
$j -= 2;
}
else
break ;
}
if ( $j > $i )
$sum = ( $sum + ( $arr [ $i ] *
$arr [ $j ]) % $Mod ) % $Mod ;
else if ( $i == $j )
$sum = ( $sum + $arr [ $i ]) % Mod;
return $sum ;
}
$arr = array (-1, 9, 4, 5, -4, 7 );
$n = sizeof( $arr );
echo findSum( $arr , $n );
?>
|
Javascript
<script>
let Mod = 1000000007;
function findSum(arr, n) {
let sum = 0;
arr.sort();
let i = 0;
while (i < n && arr[i] < 0) {
if (i != n - 1 && arr[i + 1] <= 0) {
sum = (sum + (arr[i] * arr[i + 1]) % Mod) % Mod;
i += 2;
}
else
break ;
}
let j = n - 1;
while (j >= 0 && arr[j] > 0) {
if (j != 0 && arr[j - 1] > 0) {
sum = (sum + (arr[j] * arr[j - 1]) % Mod) % Mod;
j -= 2;
} else
break ;
}
if (j > i)
sum = (sum + (arr[i] * arr[j]) % Mod) % Mod;
else if (i == j)
sum = (sum + arr[i]) % Mod;
return sum;
}
let arr = [-1, 9, 4, 5, -4, 7];
let n = arr.length;
document.write(findSum(arr, n));
</script>
|
Time Complexity : O(N log(N))
Auxiliary Space: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...