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++
// C++ program for above implementation #include <bits/stdc++.h> #define Mod 1000000007 using namespace std;
// Function to find the maximum sum long long int findSum( int arr[], int n)
{ long long int sum = 0;
// Sort the array first
sort(arr, arr + n);
// First multiply negative numbers pairwise
// and sum up from starting as to get maximum
// sum.
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 ;
}
// Second multiply positive numbers pairwise
// and summed up from the last as to get maximum
// sum.
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 ;
}
// To handle case if positive and negative
// numbers both are odd in counts.
if (j > i)
sum = (sum + (arr[i] * arr[j]) % Mod) % Mod;
// If one of them occurs odd times
else if (i == j)
sum = (sum + arr[i]) % Mod;
return sum;
} // Drivers code int main()
{ int arr[] = { -1, 9, 4, 5, -4, 7 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << findSum(arr, n);
return 0;
} |
Java
// Java program for above implementation import java.io.*;
import java.util.*;
class GFG {
static int Mod = 1000000007 ;
// Function to find the maximum sum static long findSum( int arr[], int n) {
long sum = 0 ;
// Sort the array first
Arrays.sort(arr);
// First multiply negative numbers
// pairwise and sum up from starting
// as to get maximum sum.
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 ;
}
// Second multiply positive numbers
// pairwise and summed up from the
// last as to get maximum sum.
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 ;
}
// To handle case if positive and negative
// numbers both are odd in counts.
if (j > i)
sum = (sum + (arr[i] * arr[j]) % Mod) % Mod;
// If one of them occurs odd times
else if (i == j)
sum = (sum + arr[i]) % Mod;
return sum;
} // Drivers code public static void main(String args[]) {
int arr[] = {- 1 , 9 , 4 , 5 , - 4 , 7 };
int n = arr.length;
System.out.println(findSum(arr, n));
} } /*This code is contributed by Nikita Tiwari.*/ |
Python3
# Python3 code for above implementation Mod = 1000000007
# Function to find the maximum sum def findSum(arr, n):
sum = 0
# Sort the array first
arr.sort()
# First multiply negative numbers
# pairwise and sum up from starting
# as to get maximum sum.
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
# Second multiply positive numbers
# pairwise and summed up from the
# last as to get maximum sum.
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
# To handle case if positive
# and negative numbers both
# are odd in counts.
if j > i:
sum = ( sum + (arr[i] * arr[j]) % Mod)
% Mod
# If one of them occurs odd times
elif i = = j:
sum = ( sum + arr[i]) % Mod
return sum
# Driver code arr = [ - 1 , 9 , 4 , 5 , - 4 , 7 ]
n = len (arr)
print (findSum(arr, n))
# This code is contributed by "Sharad_Bhardwaj". |
C#
// C# program for above implementation using System;
class GFG {
static int Mod = 1000000007;
// Function to find the maximum sum
static long findSum( int [] arr, int n)
{
long sum = 0;
// Sort the array first
Array.Sort(arr);
// First multiply negative numbers
// pairwise and sum up from starting
// as to get maximum sum.
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 ;
}
// Second multiply positive numbers
// pairwise and summed up from the
// last as to get maximum sum.
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 ;
}
// To handle case if positive and negative
// numbers both are odd in counts.
if (j > i)
sum = (sum + (arr[i] * arr[j]) % Mod) % Mod;
// If one of them occurs odd times
else if (i == j)
sum = (sum + arr[i]) % Mod;
return sum;
}
// Drivers code
public static void Main()
{
int [] arr = { -1, 9, 4, 5, -4, 7 };
int n = arr.Length;
Console.WriteLine(findSum(arr, n));
}
} /*This code is contributed by vt_m.*/ |
PHP
<?php // PHP program for above implementation $Mod = 1000000007;
// Function to find the maximum sum function findSum(& $arr , $n )
{ global $Mod ;
$sum = 0;
// Sort the array first
sort( $arr );
// First multiply negative numbers
// pairwise and sum up from starting
// as to get maximum sum.
$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 ;
}
// Second multiply positive numbers pairwise
// and summed up from the last as to get
// maximum sum.
$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 ;
}
// To handle case if positive and negative
// numbers both are odd in counts.
if ( $j > $i )
$sum = ( $sum + ( $arr [ $i ] *
$arr [ $j ]) % $Mod ) % $Mod ;
// If one of them occurs odd times
else if ( $i == $j )
$sum = ( $sum + $arr [ $i ]) % Mod;
return $sum ;
} // Driver code $arr = array (-1, 9, 4, 5, -4, 7 );
$n = sizeof( $arr );
echo findSum( $arr , $n );
// This code is contributed by ita_c ?> |
Javascript
<script> // JavaScript program for above implementation let Mod = 1000000007;
// Function to find the maximum sum function findSum(arr, n) {
let sum = 0;
// Sort the array first
arr.sort();
// First multiply negative numbers
// pairwise and sum up from starting
// as to get maximum sum.
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 ;
}
// Second multiply positive numbers
// pairwise and summed up from the
// last as to get maximum sum.
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 ;
}
// To handle case if positive and negative
// numbers both are odd in counts.
if (j > i)
sum = (sum + (arr[i] * arr[j]) % Mod) % Mod;
// If one of them occurs odd times
else if (i == j)
sum = (sum + arr[i]) % Mod;
return sum;
} // Driver code let arr = [-1, 9, 4, 5, -4, 7];
let n = arr.length;
document.write(findSum(arr, n));
</script> |
Output
87
Time Complexity : O(N log(N))
Auxiliary Space: O(1)