Maximize the Product of Sum by converting Array elements into given two types
Last Updated :
24 Apr, 2023
Given an array of positive integer arr[] of length N and an integer Z, (Z > arr[i] for all 0 ? i ? N - 1). Each integer of the array can be converted into the following two types:
- Keep it unchanged
- Change it to Z - arr[i].
The task is to maximize the product of the sum of these two types of elements.
Note: There should be present at least one element of each type.
Examples:
Input: N = 5, arr[] = {500, 100, 400, 560, 876}, Z = 1000
Output: 290400
Explanation: arr[] = {500, 100, 400, 560, 876}
Convert elements present at indices 0, 3 and 4 to first type = (500, 560, 876)
Convert elements present at indices 1 and 2 to second type
= (Z-arr[1], Z-arr[2]) = (1000 - 100, 1000 - 400) = (900, 600)
Sum of all first type elements = 500+560+876 = 1936
Sum of all second type elements = 900 + 600 = 1500
Product of each type sum = 1936*1500 = 290400.
Which is maximum possible for this case.
Input: N = 4, arr[] = {1, 4, 6, 3}, Z = 7
Output: 100
Explanation: Change the 1st and last element to 2nd type, i.e.,
{7-1, 7-3} = {6, 4}. The sum is (6 + 4) = 10.
Keep the 2nd and third element as it is. Their sum = (4 + 6) = 10 .
Product is 10*10 = 100. This is the maximum product possible.
Approach: The problem can be solved using Sorting based on the following idea:
The idea is to sort the arr[] in decreasing order, Calculate product of all possible combinations of the types. Obtain maximum product among all combinations.
Illustration:
Input: N = 4, arr[] = {1, 4, 6, 3}, Z = 7
After sorting arr[] in decreasing order = {6, 4, 3, 1}
Now we have 3 possible combinations for choosing all elements as first or second type:
- 1 of first type, 3 of second type
- 2 of first type, 2 of second type
- 3 of first type, 1 of second type
Let's see the product and sum at each combination for decreasing ordered arr[]:
Choosing first element as first type and next 3 elements as second type:
- Sum of first type elements = 6
- Sum of second type elements = ((7 - 4)+(7 - 3)+(7 - 1))= 13
- Product of first and second = 6 * 13 = 78
Choosing first two elements as first type and last 2 elements as second type:
- Sum of first type elements = 6 + 4 = 10
- Sum of second type elements = (7 - 3)+(7 - 1))= 10
- Product of first and second types = 10 * 10 = 100
Choosing first three elements as first type and last element as second type:
- Sum of first type elements = 6 + 4 + 3 = 13
- Sum of second type elements = (7 - 1)) = 6
- Product of first and second types = 13 * 6 = 78
As we can clearly see that 2nd combination has maximum value of product.Therefore, output for this case is :
Maximum Product: 100
Follow the steps to solve the problem:
- Sort the input array arr[].
- Traverse from the end of the array to calculate the product for all possible combinations:
- Consider all the element till index i as first type, and the suffix elements as second type.
- Calculate the product of this combination.
- Update the maximum product accordingly.
- Print the maximum product obtained.
Below is the implementation of the above approach.
C++
// C++ code to implement the approach
#include <bits/stdc++.h>
using namespace std;
// Function to obtain maximum product
// along with sum of X and Y
long Max_Product(int n, vector<long> arr, long Z)
{
// Variable to store maximum product
long product = INT_MIN;
// Sorting arr[]
sort(arr.begin(), arr.end());
// Variable to Hold sum of first type
long sum1 = 0;
// Variable to hold Maximum value
// of first type sum
long X = INT_MIN;
// Variable to hold Maximum value
// of second type sum
long Y = INT_MAX;
// Loop for iterating on sorted arr[]
// from right to left for decreasing order
for (int i = n - 1; i > 0; i--)
{
sum1 += arr[i];
long sum2 = 0;
for (int j = i - 1; j >= 0; j--)
{
sum2 = sum2 + (Z - arr[j]);
}
if (sum1 * sum2 > product)
{
product = sum1 * sum2;
X = sum1;
Y = sum2;
}
}
return (product);
}
// Driver code
int main()
{
vector<long> arr = {500, 100, 400, 560, 876};
int N = arr.size();
long Z = 1000;
// Function call
cout << (Max_Product(N, arr, Z));
}
// This code is contributed by Potta Lokesh
Java
// Java code to implement the approach
import java.util.*;
class GFG {
// Driver code
public static void main(String[] args)
{
long[] arr = { 500, 100, 400, 560, 876 };
int N = arr.length;
long Z = 1000;
// Function call
System.out.println(Max_Product(N, arr, Z));
}
// Function to obtain maximum product
// along with sum of X and Y
static long Max_Product(int n, long[] arr, long Z)
{
// Variable to store maximum product
long product = Long.MIN_VALUE;
// Sorting arr[]
Arrays.sort(arr);
// Variable to Hold sum of first type
long sum1 = 0;
// Variable to hold Maximum value
// of first type sum
long X = Integer.MIN_VALUE;
// Variable to hold Maximum value
// of second type sum
long Y = Integer.MAX_VALUE;
// Loop for iterating on sorted arr[]
// from right to left for decreasing order
for (int i = n - 1; i > 0; i--) {
sum1 += arr[i];
long sum2 = 0;
for (int j = i - 1; j >= 0; j--) {
sum2 = sum2 + (Z - arr[j]);
}
if (sum1 * sum2 > product) {
product = sum1 * sum2;
X = sum1;
Y = sum2;
}
}
return (product);
}
}
Python3
# Python code to implement the approach
# Function to obtain maximum product
# along with sum of X and Y
def Max_Product(n, arr, Z):
# Variable to store maximum product
product = -10000000000000000000000
# Sorting arr[]
arr.sort()
# Variable to Hold sum of first type
sum1 = 0
# Variable to hold Maximum value
# of first type sum
X = -10000000000000000000000
# Variable to hold Maximum value
# of second type sum
Y = 100000000000000000000000
# Loop for iterating on sorted arr[]
# from right to left for decreasing order
for i in range(n-1, 0, -1):
sum1 += arr[i]
sum2 = 0
for j in range(i-1, -1, -1):
sum2 = sum2 + (Z - arr[j])
if (sum1 * sum2 > product):
product = sum1 * sum2
X = sum1
Y = sum2
return product
# Driver code
if __name__ == "__main__":
arr = [500, 100, 400, 560, 876]
N = len(arr)
Z = 1000
# Function call
print(Max_Product(N, arr, Z))
# This code is contributed by Rohit Pradhan
C#
// C# code to implement the approach
using System;
public class GFG{
static public void Main (){
// Code
long[] arr = { 500, 100, 400, 560, 876 };
int N = arr.Length;
long Z = 1000;
// Function call
Console.WriteLine(Max_Product(N, arr, Z));
}
// Function to obtain maximum product
// along with sum of X and Y
static long Max_Product(int n, long[] arr, long Z)
{
#pragma warning disable 219
// Variable to store maximum product
long product = Int64.MinValue;
// Sorting arr[]
Array.Sort(arr);
// Variable to Hold sum of first type
long sum1 = 0;
// Variable to hold Maximum value
// of first type sum
long X = Int32.MinValue;
// Variable to hold Maximum value
// of second type sum
long Y = Int32.MaxValue;
// Loop for iterating on sorted arr[]
// from right to left for decreasing order
for (int i = n - 1; i > 0; i--) {
sum1 += arr[i];
long sum2 = 0;
for (int j = i - 1; j >= 0; j--) {
sum2 = sum2 + (Z - arr[j]);
}
if (sum1 * sum2 > product) {
product = sum1 * sum2;
X = sum1;
Y = sum2;
}
}
return product;
}
}
// This code is contributed by lokeshmvs21.
JavaScript
<script>
// JS code to implement the approach
// Function to obtain maximum product
// along with sum of X and Y
function Max_Product(n, arr, Z)
{
// Variable to store maximum product
let product = Number.MIN_VALUE;
// Sorting arr[]
arr.sort();
// Variable to Hold sum of first type
let sum1 = 0;
// Variable to hold Maximum value
// of first type sum
let X =Number.MIN_VALUE;
// Variable to hold Maximum value
// of second type sum
let Y = Number.MAX_VALUE;
// Loop for iterating on sorted arr[]
// from right to left for decreasing order
for (let i = n - 1; i > 0; i--) {
sum1 += arr[i];
let sum2 = 0;
for (let j = i - 1; j >= 0; j--) {
sum2 = sum2 + (Z - arr[j]);
}
if (sum1 * sum2 > product) {
product = sum1 * sum2;
X = sum1;
Y = sum2;
}
}
return (product);
}
// Driver code
let arr = [ 500, 100, 400, 560, 876 ];
let N = arr.length;
let Z = 1000;
// Function call
document.write(Max_Product(N, arr, Z));
// This code is contributed by sanjoy_62.
</script>
Time Complexity: O(N*N+NlogN)
Auxiliary Space: O(1)
Similar Reads
Maximize array sum by concatenating corresponding elements of given two arrays Given two array A[] and B[] of the same length, the task is to find the maximum array sum that can be formed by joining the corresponding elements of the array in any order. Input: A[] = {1, 2, 3, 4, 5}, B[] = {3, 2, 1, 4, 5} Output: 183 Explanation: Numbers formed by joining the digits of the eleme
8 min read
Maximise product of each array element with their indices by rearrangement Given an Array of N integers, the task is to maximize the value of the product of each array element with their corresponding indices by rearranging the array. Examples: Input: N = 4, arr[] = { 3, 5, 6, 1 }Output: 31Explanation: If we arrange arr[] as { 1, 3, 5, 6 }. Sum of arr[i]*i is 1*0 + 3*1 + 5
4 min read
Maximize sum by selecting X different-indexed elements from three given arrays Given three arrays A[], B[] and C[] of size N and three positive integers X, Y, and Z, the task is to find the maximum sum possible by selecting at most N array elements such that at most X elements are from the array A[], at most Y elements from the array B[], at most Z elements are from the array
15+ min read
Maximize the product of sum and least power by choosing at most K elements from given value and power Arrays Given two arrays arr[] and powr[] of size N and an integer K. Every element arr[i] has its respective power powr[i]. The task is to maximize the value of the given function by choosing at most K elements from the array. The function is defined as : f(N) = (arr[i1] + arr[i2] + arr[i3]+.....arr[in]) *
10 min read
Maximize sum of pairwise products generated from the given Arrays Given three arrays arr1[], arr2[] and arr3[] of length N1, N2, and N3 respectively, the task is to find the maximum sum possible by adding the products of pairs taken from different arrays. Note: Each array element can be a part of a single pair. Examples: Input: arr1[] = {3, 5}, arr2[] = {2, 1}, ar
11 min read
Maximize the Sum of the given array using given operations Given two arrays A[] and B[] consisting of N integers and an integer K, the task is to maximize the sum calculated from the array A[] by the following operations: For every index in B[] containing 0, the corresponding index in A[] is added to the sum.For every index in B[] containing 1, add the valu
7 min read