Given an array arr[] of N elements and an integer S. The task is to find the minimum number K such that the sum of the array elements does not exceed S after dividing all the elements by K.
Note: Consider integer division.
Examples:
Input: arr[] = {10, 7, 8, 10, 12, 19}, S = 27
Output: 3
After dividing by 3, the array becomes
{3, 2, 2, 3, 4, 6} and the new sum is 20.
Input: arr[] = {19, 17, 11, 10}, S = 40
Output: 2
Naive approach: Iterate for all values of K from 1 to the maximum element in the array plus one not maximum element because if we put k as maximum element then the sum will be one and what if the S is given to us as zero. So we iterate from k=1 to max element in the array plus one. and then sum up the array elements by dividing with K, if the sum does not exceed S then the current value will be the answer. The time complexity of this approach will be O(M * N) where M is the maximum element in the array.
C++
#include <iostream>#include <numeric> // Required for std::accumulate// Define the FindK function to find the minimum value of Kint FindK(int arr[], int n, int S){ // Initialize K to 1 int K = 1; // Enter into a loop to find the minimum value of K while (true) { // Calculate the sum of the array after dividing each element by K int sumArr = std::accumulate(arr, arr+n, 0, [=](int a, int b) { return a + b/K; }); // If the resulting sum is less than or equal to S, return K as the answer if (sumArr <= S) { return K; } // Otherwise, increment the value of K and repeat the loop K++; }}int main(){ // Define the input array and integer int arr[] = {10, 7, 8, 10, 12, 19}; int n = sizeof(arr)/sizeof(arr[0]); // Find the size of the array int S = 27; // Call the FindK function with the input array and integer, and print the result std::cout << FindK(arr, n, S) << std::endl; // Output: 3 return 0;} |
Java
import java.util.*;public class Main { public static int FindK(int arr[], int n, int S) { int K = 1; while (true) { // declare a final variable k and assign the value of K to it final int k = K; int sumArr = Arrays.stream(arr).reduce( 0, // use the final variable k in the lambda expression (a, b) -> a + b/k); if (sumArr <= S) { return K; } K++; } } public static void main(String[] args) { int arr[] = {10, 7, 8, 10, 12, 19}; int n = arr.length; int S = 27; System.out.println(FindK(arr, n, S)); // Output: 3 }} |
Python3
# Define the input array and integerarr = [10, 7, 8, 10, 12, 19]S = 27# Define a function to find the minimum value of Kdef find_k(arr, S): # Initialize K to 1 K = 1 # Enter into a loop to find the minimum value of K while True: # Calculate the sum of the array after dividing each element by K sum_arr = sum([i//K for i in arr]) # If the resulting sum is less than or equal to S, return K as the answer if sum_arr <= S: return K # Otherwise, increment the value of K and repeat the loop K += 1# Call the find_k function with the input array and integer, and print the resultprint(find_k(arr, S)) # Output: 3 |
Javascript
// Define the input array and integerconst arr = [10, 7, 8, 10, 12, 19];const S = 27;// Define a function to find the minimum value of Kfunction find_k(arr, S) { // Initialize K to 1 let K = 1; // Enter into a loop to find the minimum value of K while (true) { // Calculate the sum of the array after dividing each element by K let sum_arr = arr.reduce((acc, curr) => acc + Math.floor(curr / K), 0); // If the resulting sum is less than or equal to S, return K as the answer if (sum_arr <= S) { return K; } // Otherwise, increment the value of K and repeat the loop K++; }}// Call the find_k function with the input array and integer, and print the resultconsole.log(find_k(arr, S)); // Output: 3 |
C#
using System;using System.Linq;public class MinimumKValue{ public static void Main() { // Define the input array and integer int[] arr = {10, 7, 8, 10, 12, 19}; int S = 27; // Call the FindK function with the input array and integer, and print the result Console.WriteLine(FindK(arr, S)); // Output: 3 } // Define a function to find the minimum value of K public static int FindK(int[] arr, int S) { // Initialize K to 1 int K = 1; // Enter into a loop to find the minimum value of K while (true) { // Calculate the sum of the array after dividing each element by K int sumArr = arr.Sum(i => i / K); // If the resulting sum is less than or equal to S, return K as the answer if (sumArr <= S) { return K; } // Otherwise, increment the value of K and repeat the loop K++; } }} |
3
Efficient approach: An efficient approach is to find the value of K by performing a binary search on the answer. Initiate a binary search on the value of K and a check is done inside it to see if the sum exceeds K then the binary search is performed on the second half or the first half accordingly.
Below is the implementation of the above approach:
C++
// C++ implementation of the approach#include <bits/stdc++.h>using namespace std;// Function to return the minimum value of k// that satisfies the given conditionint findMinimumK(int a[], int n, int s){ // Find the maximum element int maximum = a[0]; for (int i = 0; i < n; i++) { maximum = max(maximum, a[i]); } // Lowest answer can be 1 and the // highest answer can be (maximum + 1) int low = 1, high = maximum + 1; int ans = high; // Binary search while (low <= high) { // Get the mid element int mid = (low + high) / 2; int sum = 0; // Calculate the sum after dividing // the array by new K which is mid for (int i = 0; i < n; i++) { sum += (int)(a[i] / mid); } // Search in the second half if (sum > s) low = mid + 1; // First half else { ans = min(ans, mid); high = mid - 1; } } return ans;}// Driver codeint main(){ int a[] = { 10, 7, 8, 10, 12, 19 }; int n = sizeof(a) / sizeof(a[0]); int s = 27; cout << findMinimumK(a, n, s); return 0;} |
Java
// Java implementation of the approach class GFG { // Function to return the minimum value of k // that satisfies the given condition static int findMinimumK(int a[], int n, int s) { // Find the maximum element int maximum = a[0]; for (int i = 0; i < n; i++) { maximum = Math.max(maximum, a[i]); } // Lowest answer can be 1 and the // highest answer can be (maximum + 1) int low = 1, high = maximum + 1; int ans = high; // Binary search while (low <= high) { // Get the mid element int mid = (low + high) / 2; int sum = 0; // Calculate the sum after dividing // the array by new K which is mid for (int i = 0; i < n; i++) { sum += (int)(a[i] / mid); } // Search in the second half if (sum > s) low = mid + 1; // First half else { ans = Math.min(ans, mid); high = mid - 1; } } return ans; } // Driver code public static void main (String[] args) { int a[] = { 10, 7, 8, 10, 12, 19 }; int n = a.length; int s = 27; System.out.println(findMinimumK(a, n, s)); } } // This code is contributed by AnkitRai01 |
Python3
# Python3 implementation of the approach# Function to return the minimum value of k# that satisfies the given conditiondef findMinimumK(a, n, s): # Find the maximum element maximum = a[0] for i in range(n): maximum = max(maximum, a[i]) # Lowest answer can be 1 and the # highest answer can be (maximum + 1) low = 1 high = maximum + 1 ans = high # Binary search while (low <= high): # Get the mid element mid = (low + high) // 2 sum = 0 # Calculate the sum after dividing # the array by new K which is mid for i in range(n): sum += (a[i] // mid) # Search in the second half if (sum > s): low = mid + 1 # First half else: ans = min(ans, mid) high = mid - 1 return ans# Driver codea = [10, 7, 8, 10, 12, 19]n = len(a)s = 27print(findMinimumK(a, n, s))# This code is contributed by Mohit Kumar |
Javascript
<script>// javascript implementation of the approach // Function to return the minimum value of k // that satisfies the given condition function findMinimumK(a , n , s) { // Find the maximum element var maximum = a[0]; for (i = 0; i < n; i++) { maximum = Math.max(maximum, a[i]); } // Lowest answer can be 1 and the // highest answer can be (maximum + 1) var low = 1, high = maximum + 1; var ans = high; // Binary search while (low <= high) { // Get the mid element var mid = parseInt((low + high) / 2); var sum = 0; // Calculate the sum after dividing // the array by new K which is mid for (i = 0; i < n; i++) { sum += parseInt( (a[i] / mid)); } // Search in the second half if (sum > s) low = mid + 1; // First half else { ans = Math.min(ans, mid); high = mid - 1; } } return ans; } // Driver code var a = [ 10, 7, 8, 10, 12, 19 ]; var n = a.length; var s = 27; document.write(findMinimumK(a, n, s));// This code is contributed by todaysgaurav</script> |
C#
// C# implementation of the approach using System;class GFG { // Function to return the minimum value of k // that satisfies the given condition static int findMinimumK(int []a, int n, int s) { // Find the maximum element int maximum = a[0]; for (int i = 0; i < n; i++) { maximum = Math.Max(maximum, a[i]); } // Lowest answer can be 1 and the // highest answer can be (maximum + 1) int low = 1, high = maximum + 1; int ans = high; // Binary search while (low <= high) { // Get the mid element int mid = (low + high) / 2; int sum = 0; // Calculate the sum after dividing // the array by new K which is mid for (int i = 0; i < n; i++) { sum += (int)(a[i] / mid); } // Search in the second half if (sum > s) low = mid + 1; // First half else { ans = Math.Min(ans, mid); high = mid - 1; } } return ans; } // Driver code public static void Main () { int []a = { 10, 7, 8, 10, 12, 19 }; int n = a.Length; int s = 27; Console.WriteLine(findMinimumK(a, n, s)); } } // This code is contributed by AnkitRai01 |
3
Time Complexity: O(N*(log N)), N=Array length
Auxiliary Space: O(1)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!

… [Trackback]
[…] Read More here on that Topic: geeksforgeeks.org/minimum-k-such-that-sum-of-array-elements-after-division-by-k-does-not-exceed-s/ […]
… [Trackback]
[…] Here you will find 11062 more Info on that Topic: geeksforgeeks.org/minimum-k-such-that-sum-of-array-elements-after-division-by-k-does-not-exceed-s/ […]