Distribution of a Number in Array within a Range

Given the integers S, N, K, L, and R where S has to be distributed in an array of size N such that each element must be from the range [L, R] and the sum of K elements of the array should be greater than the sum of the remaining N – K elements whose sum is equal to Sk and these elements are in non-increasing order.
Examples:
Input: N = 5, K = 3, L = 1, R = 3, S = 13, Sk = 9
Output: 3 3 3 2 2
Input: N = 5, K = 3, L = 1, R = 3, S = 15, Sk = 9
Output: 3 3 3 3 3
Approach: If Sk can be distributed into k elements equally, then store Sk/k into all the first k elements of the array, otherwise the first element of the array will be (Sk/k) + (Sk % k), and the remaining k – 1 element will be (Sk – Sk % k) % k – 1. Similarly, distribute the S-Sk into n-k elements.
Below is the implementation of the above approach:
C++
// C++ implementation of the approach#include <bits/stdc++.h>using namespace std;// Function for the distribution of the numbervoid distribution(int n, int k, int l, int r, int S, int Sk){ int a[n]; int len = k, temp, rem, s; int diff = S - Sk; for (int i = 0; i < len; i++) { // Distribute the number // among k elements temp = Sk / k; rem = Sk % k; if (temp + rem >= l && temp + rem <= r) { a[i] = temp; } else if (temp + rem > r) { a[i] = r; } else if (temp + rem < r) { cout << "-1"; return; } Sk = Sk - a[i]; k = k - 1; } // If there is some remaining // sum to distribute if (Sk > 0) { cout << "-1"; return; } // If there are elements remaining // to distribute i.e. (n - k) if (len) { k = n - len; for (int i = len; i < n; i++) { // Divide the remaining sum into // n-k elements temp = diff / k; rem = diff % k; if (temp + rem >= l && temp + rem <= r) { a[i] = temp; } else if (temp + rem > r) { a[i] = r; } else if (temp + rem < r) { cout << "-1"; return; } diff = diff - a[i]; k = k - 1; } if (diff) { cout << "-1"; return; } } // Print the distribution for (int i = 0; i < n; i++) { cout << a[i] << " "; }}// Driver codeint main(){ int n = 5, k = 3, l = 1, r = 5, S = 13, Sk = 9; distribution(n, k, l, r, S, Sk); return 0;} |
Java
// Java implementation of the approach class GFG { // Function for the distribution of the number static void distribution(int n, int k, int l, int r, int S, int Sk) { int a[] = new int[n]; int len = k, temp, rem, s; int diff = S - Sk; for (int i = 0; i < len; i++) { // Distribute the number // among k elements temp = Sk / k; rem = Sk % k; if (temp + rem >= l && temp + rem <= r) { a[i] = temp; } else if (temp + rem > r) { a[i] = r; } else if (temp + rem < r) { System.out.print("-1"); return; } Sk = Sk - a[i]; k = k - 1; } // If there is some remaining // sum to distribute if (Sk > 0) { System.out.print("-1"); return; } // If there are elements remaining // to distribute i.e. (n - k) if (len != 0) { k = n - len; for (int i = len; i < n; i++) { // Divide the remaining sum into // n-k elements temp = diff / k; rem = diff % k; if (temp + rem >= l && temp + rem <= r) { a[i] = temp; } else if (temp + rem > r) { a[i] = r; } else if (temp + rem < r) { System.out.print("-1"); return; } diff = diff - a[i]; k = k - 1; } if (diff != 0) { System.out.print("-1"); return; } } // Print the distribution for (int i = 0; i < n; i++) { System.out.print(a[i] + " "); } } // Driver code public static void main (String[] args) { int n = 5, k = 3, l = 1, r = 5, S = 13, Sk = 9; distribution(n, k, l, r, S, Sk); } }// This code is contributed by AnkitRai01 |
Python3
# Python implementation of the approach # Function for the distribution of the numberdef distribution(n, k, l, r, S, Sk): a = [0] * n; len = k; temp, rem, s = 0, 0, 0; diff = S - Sk; for i in range(len): # Distribute the number # among k elements temp = Sk / k; rem = Sk % k; if (temp + rem >= l and temp + rem <= r): a[i] = temp; elif(temp + rem > r): a[i] = r; elif(temp + rem < r): print("-1"); return; Sk = Sk - a[i]; k = k - 1; # If there is some remaining # sum to distribute if (Sk > 0): print("-1"); return; # If there are elements remaining # to distribute i.e. (n - k) if (len != 0): k = n - len; for i in range(len, n): # Divide the remaining sum into # n-k elements temp = diff / k; rem = diff % k; if (temp + rem >= l and temp + rem <= r): a[i] = temp; elif(temp + rem > r): a[i] = r; elif(temp + rem < r): print("-1"); return; diff = diff - a[i]; k = k - 1; if (diff != 0): print("-1"); return; # Print the distribution for i in range(n): print(int(a[i]), end=" "); # Driver codeif __name__ == '__main__': n, k, l, r, S, Sk = 5, 3, 1, 5, 13, 9; distribution(n, k, l, r, S, Sk); # This code is contributed by PrinciRaj1992 |
C#
// C# implementation of the approach using System;class GFG { // Function for the distribution of the number static void distribution(int n, int k, int l, int r, int S, int Sk) { int []a = new int[n]; int len = k, temp, rem; int diff = S - Sk; for (int i = 0; i < len; i++) { // Distribute the number // among k elements temp = Sk / k; rem = Sk % k; if (temp + rem >= l && temp + rem <= r) { a[i] = temp; } else if (temp + rem > r) { a[i] = r; } else if (temp + rem < r) { Console.Write("-1"); return; } Sk = Sk - a[i]; k = k - 1; } // If there is some remaining // sum to distribute if (Sk > 0) { Console.Write("-1"); return; } // If there are elements remaining // to distribute i.e. (n - k) if (len != 0) { k = n - len; for (int i = len; i < n; i++) { // Divide the remaining sum into // n-k elements temp = diff / k; rem = diff % k; if (temp + rem >= l && temp + rem <= r) { a[i] = temp; } else if (temp + rem > r) { a[i] = r; } else if (temp + rem < r) { Console.Write("-1"); return; } diff = diff - a[i]; k = k - 1; } if (diff != 0) { Console.Write("-1"); return; } } // Print the distribution for (int i = 0; i < n; i++) { Console.Write(a[i] + " "); } } // Driver code public static void Main(String[] args) { int n = 5, k = 3, l = 1, r = 5, S = 13, Sk = 9; distribution(n, k, l, r, S, Sk); } }// This code is contributed by PrinciRaj1992 |
Javascript
<script>// Javascript implementation of the approach// Function for the distribution of the numberfunction distribution(n, k, l, r, S, Sk){ let a = new Array(n); let len = k, temp, rem, s; let diff = S - Sk; for (let i = 0; i < len; i++) { // Distribute the number // among k elements temp = Sk / k; rem = Sk % k; if (temp + rem >= l && temp + rem <= r) { a[i] = temp; } else if (temp + rem > r) { a[i] = r; } else if (temp + rem < r) { document.write("-1"); return; } Sk = Sk - a[i]; k = k - 1; } // If there is some remaining // sum to distribute if (Sk > 0) { document.write("-1"); return; } // If there are elements remaining // to distribute i.e. (n - k) if (len) { k = n - len; for (let i = len; i < n; i++) { // Divide the remaining sum into // n-k elements temp = diff / k; rem = diff % k; if (temp + rem >= l && temp + rem <= r) { a[i] = temp; } else if (temp + rem > r) { a[i] = r; } else if (temp + rem < r) { document.write("-1"); return; } diff = diff - a[i]; k = k - 1; } if (diff) { document.write("-1"); return; } } // Print the distribution for (let i = 0; i < n; i++) { document.write(a[i] + " "); }}// Driver codelet n = 5, k = 3, l = 1, r = 5, S = 13, Sk = 9;distribution(n, k, l, r, S, Sk);</script> |
3 3 3 2 2
Time Complexity: O(n)
Auxiliary Space: O(n)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 zambiatek!


