Skip to content
Related Articles

Related Articles

Minimum sum after subtracting multiples of k from the elements of the array
  • Last Updated : 17 Dec, 2018

Given an integer K and an integer array arr, the task is to find the minimum possible sum of all the elements of the array after they are reduced by subtracting a multiple of K from each element (the result must be positive and every element of the array must be equal after this reduction). If the array cannot be reduced then print -1. Note that an element may or may not be reduced in the final state of the array.

Examples:

Input: arr[] = {2, 3, 4, 5}, K = 1
Output: 4
Subtract 1 form 2, arr[] = {1, 3, 4, 5}
Subtract 2 from 3, arr[] = {1, 1, 4, 5}
Subtract 3 from 4, arr[] = {1, 1, 1, 5}
Subtract 4 from 5 to make arr[] = {1, 1, 1, 1}, thus giving minimum possible sum as 4.

Input: arr[] = {5, 6, 7}, K = 2
Output: -1

Approach: First, the array needs to be sorted as the problem can be solved using greedy approach.



  • Sort the array, if arr[0] < 0 then print -1 as every element needs to be ≥ 0.
  • If K == 0 then no element can be reduced further. So in order to have an answer every element of the array must be equal. So the sum of elements is n * arr[0] else print -1.
  • Now for the rest of the elements, run a loop from 1 to n and check whether ((arr[i] – arr[0]) % K) == 0 i.e. arr[i] can be reduced to arr[0].
  • If above condition fails for any element, print -1.
  • Else if k == 1 then the answer is n i.e. every element will get reduced to 1.
  • Else the answer is n * (a[0] % k).

Below is the implementation of the above approach:

C++




// C++ program of the above approach
#include <bits/stdc++.h>
using namespace std;
  
// function to calculate minimum sum after transformation
int min_sum(int n, int k, int a[])
{
  
    sort(a, a + n);
  
    if (a[0] < 0) 
        return -1;
      
  
    // no element can be reduced further
    if (k == 0) {
  
        // if all the elements of the array
        // are identical
        if (a[0] == a[n - 1])
            return (n * a[0]);
        else
            return -1;
    }
    else {
        int f = 0;
        for (int i = 1; i < n; i++) {
  
            int p = a[i] - a[0];
  
            // check if a[i] can be reduced to a[0]
            if (p % k == 0)
                continue;
            else {
                f = 1;
                break;
            }
        }
  
        // one of the elements cannot be reduced
        // to be equal to the other elements
        if (f)
            return -1;
        else {
  
            // if k = 1 then all elements can be reduced to 1
            if (k == 1)
                return n;
            else
                return (n * (a[0] % k));
        }
    }
}
  
// Driver code
int main()
{
    int arr[] = { 2, 3, 4, 5 };
    int K = 1;
    int N = sizeof(arr) / sizeof(arr[0]);
    cout << min_sum(N, K, arr);
  
    return 0;
}

Java




// Java program of the above approach
  
import java.io.*;
import java.util.*;
class GFG {
      
// function to calculate minimum sum after transformation
static int min_sum(int n, int k, int a[])
{
  
    Arrays.sort(a);
  
    if (a[0] < 0
        return -1;
      
  
    // no element can be reduced further
    if (k == 0) {
  
        // if all the elements of the array
        // are identical
        if (a[0] == a[n - 1])
            return (n * a[0]);
        else
            return -1;
    }
    else {
        int f = 0;
        for (int i = 1; i < n; i++) {
  
            int p = a[i] - a[0];
  
            // check if a[i] can be reduced to a[0]
            if (p % k == 0)
                continue;
            else {
                f = 1;
                break;
            }
        }
  
        // one of the elements cannot be reduced
        // to be equal to the other elements
        if (f>0)
            return -1;
        else {
  
            // if k = 1 then all elements can be reduced to 1
            if (k == 1)
                return n;
            else
                return (n * (a[0] % k));
        }
    }
}
  
// Driver code
  
  
    public static void main (String[] args) {
            int arr[] = { 2, 3, 4, 5 };
    int K = 1;
    int N = arr.length;
    System.out.println(min_sum(N, K, arr));
    }
}
// This code is contributed by shs..

Python3




# Python 3 program of the above approach
  
# function to calculate minimum sum 
# after transformation
def min_sum(n, k, a):
    a.sort(reverse = False)
  
    if (a[0] < 0):
        return -1
      
    # no element can be reduced further
    if (k == 0):
          
        # if all the elements of the
        # array are identical
        if (a[0] == a[n - 1]):
            return (n * a[0])
        else:
            return -1
      
    else:
        f = 0
        for i in range(1, n, 1):
            p = a[i] - a[0]
  
            # check if a[i] can be 
            # reduced to a[0]
            if (p % k == 0):
                continue
            else:
                f = 1
                break
          
        # one of the elements cannot be reduced
        # to be equal to the other elements
        if (f):
            return -1
        else:
              
            # if k = 1 then all elements
            # can be reduced to 1
            if (k == 1):
                return n
            else:
                return (n * (a[0] % k))
      
# Driver code
if __name__ == '__main__':
    arr = [2, 3, 4, 5]
    K = 1
    N = len(arr)
    print(min_sum(N, K, arr))
  
# This code is contributed by
# Surendra_Gangwar

C#




// C# program of the above approach
using System;
  
class GFG 
{
      
// function to calculate minimum 
// sum after transformation
static int min_sum(int n, int k, int[] a)
{
  
    Array.Sort(a);
  
    if (a[0] < 0) 
        return -1;
  
    // no element can be reduced further
    if (k == 0)
    {
  
        // if all the elements of the array
        // are identical
        if (a[0] == a[n - 1])
            return (n * a[0]);
        else
            return -1;
    }
    else 
    {
        int f = 0;
        for (int i = 1; i < n; i++) 
        {
            int p = a[i] - a[0];
  
            // check if a[i] can be 
            // reduced to a[0]
            if (p % k == 0)
                continue;
            else 
            {
                f = 1;
                break;
            }
        }
  
        // one of the elements cannot be reduced
        // to be equal to the other elements
        if (f > 0)
            return -1;
        else
        {
  
            // if k = 1 then all elements can 
            // be reduced to 1
            if (k == 1)
                return n;
            else
                return (n * (a[0] % k));
        }
    }
}
  
// Driver code
public static void Main ()
{
    int[] arr = new int[] { 2, 3, 4, 5 };
    int K = 1;
    int N = arr.Length;
    Console.WriteLine(min_sum(N, K, arr));
}
}
  
// This code is contributed by mits

PHP




<?php
// PHP program of the above approach
  
// function to calculate minimum 
// sum after transformation
function min_sum($n, $k, $a)
{
  
    sort($a);
  
    if ($a[0] < 0) 
        return -1;
      
  
    // no element can be reduced further
    if ($k == 0)
    {
  
        // if all the elements of the array
        // are identical
        if ($a[0] == $a[$n - 1])
            return ($n * $a[0]);
        else
            return -1;
    }
    else 
    {
        $f = 0;
        for ($i = 1; $i <$n; $i++) 
        {
  
            $p = $a[$i] - $a[0];
  
            // check if a[i] can be reduced to a[0]
            if ($p % $k == 0)
                continue;
            else
            {
                $f = 1;
                break;
            }
        }
  
        // one of the elements cannot be reduced
        // to be equal to the other elements
        if ($f)
            return -1;
        else
        {
  
            // if k = 1 then all elements can
            // be reduced to 1
            if ($k == 1)
                return $n;
            else
                return ($n * ($a[0] % $k));
        }
    }
}
  
// Driver code
$arr = array(2, 3, 4, 5 );
$K = 1;
$N = count($arr);
echo min_sum($N, $K, $arr);
  
// This code is contributed by inder_verma
?>
Output:
4

Time Complexity : O(n Log n)

Further Optimizations :
Instead of sorting the array, we can find minimum element in O(n) time. We can check all elements are same or not also in O(n) time.

Attention reader! Don’t stop learning now. Get hold of all the important mathematical concepts for competitive programming with the Essential Maths for CP Course at a student-friendly price. To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

My Personal Notes arrow_drop_up
Recommended Articles
Page :