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++
#include <bits/stdc++.h>
using namespace std;
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++) {
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 (Sk > 0) {
cout << "-1" ;
return ;
}
if (len) {
k = n - len;
for ( int i = len; i < n; i++) {
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 ;
}
}
for ( int i = 0; i < n; i++) {
cout << a[i] << " " ;
}
}
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
class GFG
{
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++)
{
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 (Sk > 0 )
{
System.out.print( "-1" );
return ;
}
if (len != 0 )
{
k = n - len;
for ( int i = len; i < n; i++)
{
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 ;
}
}
for ( int i = 0 ; i < n; i++)
{
System.out.print(a[i] + " " );
}
}
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);
}
}
|
Python3
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 ):
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 (Sk > 0 ):
print ( "-1" );
return ;
if ( len ! = 0 ):
k = n - len ;
for i in range ( len , n):
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 ;
for i in range (n):
print ( int (a[i]), end = " " );
if __name__ = = '__main__' :
n, k, l, r, S, Sk = 5 , 3 , 1 , 5 , 13 , 9 ;
distribution(n, k, l, r, S, Sk);
|
C#
using System;
class GFG
{
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++)
{
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 (Sk > 0)
{
Console.Write( "-1" );
return ;
}
if (len != 0)
{
k = n - len;
for ( int i = len; i < n; i++)
{
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 ;
}
}
for ( int i = 0; i < n; i++)
{
Console.Write(a[i] + " " );
}
}
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);
}
}
|
Javascript
<script>
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++) {
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 (Sk > 0) {
document.write( "-1" );
return ;
}
if (len) {
k = n - len;
for (let i = len; i < n; i++) {
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 ;
}
}
for (let i = 0; i < n; i++) {
document.write(a[i] + " " );
}
}
let n = 5, k = 3, l = 1, r = 5, S = 13, Sk = 9;
distribution(n, k, l, r, S, Sk);
</script>
|
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!
Last Updated :
03 Feb, 2022
Like Article
Save Article