Saturday, September 21, 2024
Google search engine
HomeData Modelling & AIDistribution of a Number in Array within a Range

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 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




<script>
// Javascript implementation of the approach
 
// Function for the distribution of the number
function 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 code
 
let n = 5, k = 3, l = 1, r = 5, S = 13, Sk = 9;
 
distribution(n, k, l, r, S, Sk);
</script>


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 neveropen!

RELATED ARTICLES

Most Popular

Recent Comments