Generate an array of size K which satisfies the given conditions
Given two integers N and K, the task is to generate an array arr[] of length K such that:
- arr[0] + arr[1] + … + arr[K – 1] = N.
- arr[i] > 0 for 0 ? i < K.
- arr[i] < arr[i + 1] ? 2 * arr[i] for 0 ? i < K – 1.
If there are multiple answers find any one of them, otherwise, print -1.
Examples:
Input: N = 26, K = 6
Output: 1 2 4 5 6 8
The generated array satisfies all of the given conditions.
Input: N = 8, K = 3
Output: -1
Approach: Let r = n – k * (k + 1) / 2. If r < 0 then answer is -1 already. Otherwise, let’s construct the array arr[], where all arr[i] are floor(r / k) except for rightmost r % k values, they are ceil(r / k).
It is easy to see that the sum of this array is r, it is sorted in non-decreasing order and the difference between the maximum and the minimum element is not greater than 1.
Let’s add 1 to arr[1], 2 to arr[2], and so on (this is what we subtract from n at the beginning).
Then, if r != k – 1 or k = 1 then arr[] is our required array. Otherwise, we got some array of kind 1, 3, ….., arr[k]. For k = 2 or k = 3, there is no answer for this case. Otherwise, we can subtract 1 from arr[2] and add it to arr[k] and this answer will be correct.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void generateArray( int n, int k)
{
vector< int > array(k, 0);
int remaining = n - int (k * (k + 1) / 2);
if (remaining < 0)
cout << ( "NO" );
int right_most = remaining % k;
int high = ceil (remaining / (k * 1.0));
int low = floor (remaining / (k * 1.0));
for ( int i = k - right_most; i < k; i++)
array[i]= high;
for ( int i = 0; i < (k - right_most); i++)
array[i]= low;
for ( int i = 0; i < k; i++)
array[i] += i + 1;
if (k - 1 != remaining or k == 1)
{
for ( int u:array) cout << u << " " ;
}
else if (k == 2 or k == 3)
printf ( "-1\n" );
else
{
array[1] -= 1;
array[k - 1] += 1;
for ( int u:array) cout << u << " " ;
}
}
int main()
{
int n = 26, k = 6;
generateArray(n, k);
return 0;
}
|
Java
class GFG
{
static void generateArray( int n, int k)
{
int []array = new int [k];
int remaining = n - (k * (k + 1 ) / 2 );
if (remaining < 0 )
System.out.print( "NO" );
int right_most = remaining % k;
int high = ( int ) Math.ceil(remaining / (k * 1.0 ));
int low = ( int ) Math.floor(remaining / (k * 1.0 ));
for ( int i = k - right_most; i < k; i++)
array[i] = high;
for ( int i = 0 ; i < (k - right_most); i++)
array[i] = low;
for ( int i = 0 ; i < k; i++)
array[i] += i + 1 ;
if (k - 1 != remaining || k == 1 )
{
for ( int u:array)
System.out.print(u + " " );
}
else if (k == 2 || k == 3 )
System.out.printf( "-1\n" );
else
{
array[ 1 ] -= 1 ;
array[k - 1 ] += 1 ;
for ( int u:array)
System.out.print(u + " " );
}
}
public static void main(String[] args)
{
int n = 26 , k = 6 ;
generateArray(n, k);
}
}
|
Python3
import sys
from math import floor, ceil
def generateArray(n, k):
array = [ 0 ] * k
remaining = n - int (k * (k + 1 ) / 2 )
if remaining< 0 :
print ( "NO" )
sys.exit()
right_most = remaining % k
high = ceil(remaining / k)
low = floor(remaining / k)
for i in range (k - right_most, k):
array[i] = high
for i in range (k - right_most):
array[i] = low
for i in range (k):
array[i] + = i + 1
if k - 1 ! = remaining or k = = 1 :
print ( * array)
sys.exit()
elif k = = 2 or k = = 3 :
print ( "-1" )
sys.exit()
else :
array[ 1 ] - = 1
array[k - 1 ] + = 1
print ( * array)
sys.exit()
if __name__ = = "__main__" :
n, k = 26 , 6
generateArray(n, k)
|
C#
using System;
class GFG
{
static void generateArray( int n, int k)
{
int []array = new int [k];
int remaining = n - (k * (k + 1) / 2);
if (remaining < 0)
Console.Write( "NO" );
int right_most = remaining % k;
int high = ( int ) Math.Ceiling(remaining /
(k * 1.0));
int low = ( int ) Math.Floor(remaining /
(k * 1.0));
for ( int i = k - right_most; i < k; i++)
array[i] = high;
for ( int i = 0;
i < (k - right_most); i++)
array[i] = low;
for ( int i = 0; i < k; i++)
array[i] += i + 1;
if (k - 1 != remaining || k == 1)
{
foreach ( int u in array)
Console.Write(u + " " );
}
else if (k == 2 || k == 3)
Console.Write( "-1\n" );
else
{
array[1] -= 1;
array[k - 1] += 1;
foreach ( int u in array)
Console.Write(u + " " );
}
}
public static void Main(String[] args)
{
int n = 26, k = 6;
generateArray(n, k);
}
}
|
Javascript
<script>
function generateArray(n , k) {
var array = Array(k).fill(0);
var remaining = n - parseInt(k * (k + 1) / 2);
if (remaining < 0)
document.write( "NO" );
var right_most = remaining % k;
var high = parseInt( Math.ceil(remaining / (k * 1.0)));
var low = parseInt( Math.floor(remaining / (k * 1.0)));
for (i = k - right_most; i < k; i++)
array[i] = high;
for (i = 0; i < (k - right_most); i++)
array[i] = low;
for (i = 0; i < k; i++)
array[i] += i + 1;
if (k - 1 != remaining || k == 1) {
for ( var u = 0;u< array.length;u++)
document.write(array[u] + " " );
}
else if (k == 2 || k == 3)
document.write( "-1" );
else {
array[1] -= 1;
array[k - 1] += 1;
for ( var f = 0;f< array.length;f++)
document.write(array[f] + " " );
}
}
var n = 26, k = 6;
generateArray(n, k);
</script>
|
Time Complexity: O(K)
Auxiliary Space: O(K)
Last Updated :
23 Jul, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...