# 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 ` `using` `namespace` `std;`   `// Function for the distribution of the number` `void` `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 code` `int` `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 number` `def` `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 code` `if` `__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

 ``

Output:

`3 3 3 2 2`

Time Complexity: O(n)

Auxiliary Space: O(n)

Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!

Previous
Next