Generate an array of K elements such that sum of elements is N and the condition a[i] < a[i+1] <= 2*a[i] is met | Set 2
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 3 4 6 10
The above array satisfies all the conditions.
Input: N = 8, k = 3
Output: -1
Approach: Initially we form the array with the lowest possible configuration which is filling up the array with 1, 2, 3, 4.. which satisfies the given conditions. If the summation of 1..K is greater than N, then the array cannot be formed. In order to form the array, fill up the array initially with 1, 2, 3, .. K. Again add (n-sum)/k to every element in the array, because in adding so, no conditions are void, because we are adding equal elements to every number.
The remaining number rem is greedily added from the back, to make every number twice of its previous number. After filling up the array, if any of the given conditions are not met, print -1, else the formed array will be our desired answer.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void solve( int n, int k)
{
int mini = 0;
int x1 = 1;
int a[k];
for ( int i = 1; i <= k; i++) {
mini += x1;
a[i - 1] = x1;
x1 += 1;
}
if (n < mini) {
cout << "-1" ;
return ;
}
int rem = n - mini;
int cnt = rem / k;
rem = rem % k;
for ( int i = 0; i < k; i++)
a[i] += cnt;
for ( int i = k - 1; i > 0 && rem > 0; i--) {
int xx = a[i - 1] * 2;
int left = xx - a[i];
if (rem >= left) {
a[i] = xx;
rem -= left;
}
else {
a[i] += rem;
rem = 0;
}
}
int sum = a[0];
for ( int i = 1; i < k; i++) {
if (a[i] > 2 * a[i - 1]) {
cout << "-1" ;
return ;
}
sum += a[i];
}
if (sum != n) {
cout << "-1" ;
return ;
}
for ( int i = 0; i < k; i++)
cout << a[i] << " " ;
}
int main()
{
int n = 26, k = 6;
solve(n, k);
return 0;
}
|
Java
import java.util.*;
class GFG {
static void solve( int n, int k)
{
int mini = 0 ;
int x1 = 1 ;
int [] a = new int [k];
for ( int i = 1 ; i <= k; i++) {
mini += x1;
a[i - 1 ] = x1;
x1 += 1 ;
}
if (n < mini) {
System.out.print( "-1" );
return ;
}
int rem = n - mini;
int cnt = rem / k;
rem = rem % k;
for ( int i = 0 ; i < k; i++)
a[i] += cnt;
for ( int i = k - 1 ; i > 0 && rem > 0 ; i--) {
int xx = a[i - 1 ] * 2 ;
int left = xx - a[i];
if (rem >= left) {
a[i] = xx;
rem -= left;
}
else {
a[i] += rem;
rem = 0 ;
}
}
int sum = a[ 0 ];
for ( int i = 1 ; i < k; i++) {
if (a[i] > 2 * a[i - 1 ]) {
System.out.print( "-1" );
return ;
}
sum += a[i];
}
if (sum != n) {
System.out.print( "-1" );
return ;
}
for ( int i = 0 ; i < k; i++)
System.out.print(a[i] + " " );
}
public static void main(String[] args)
{
int n = 26 , k = 6 ;
solve(n, k);
}
}
|
Python3
def solve(n, k):
mini = 0
x1 = 1
a = [ 0 for i in range (k)]
for i in range ( 1 , k + 1 ):
mini + = x1
a[i - 1 ] = x1
x1 + = 1
if (n < mini):
print ( "-1" ,end = "")
return
rem = n - mini
cnt = int (rem / k)
rem = rem % k
for i in range (k):
a[i] + = cnt
i = k - 1
while (i > 0 and rem > 0 ):
xx = a[i - 1 ] * 2
left = xx - a[i]
if (rem > = left):
a[i] = xx
rem - = left
else :
a[i] + = rem
rem = 0
i - = 1
sum = a[ 0 ]
for i in range ( 1 , k):
if (a[i] > 2 * a[i - 1 ]):
print ( "-1" , end = "")
return
sum + = a[i]
if ( sum ! = n):
print ( "-1" , end = "")
return
for i in range (k):
print (a[i], end = " " )
if __name__ = = '__main__' :
n = 26
k = 6
solve(n, k)
|
C#
using System;
class GFG
{
static void solve( int n, int k)
{
int mini = 0;
int x1 = 1;
int [] a = new int [k];
for ( int i = 1; i <= k; i++)
{
mini += x1;
a[i - 1] = x1;
x1 += 1;
}
if (n < mini)
{
Console.Write( "-1" );
return ;
}
int rem = n - mini;
int cnt = rem / k;
rem = rem % k;
for ( int i = 0; i < k; i++)
a[i] += cnt;
for ( int i = k - 1; i > 0 && rem > 0; i--)
{
int xx = a[i - 1] * 2;
int left = xx - a[i];
if (rem >= left)
{
a[i] = xx;
rem -= left;
}
else
{
a[i] += rem;
rem = 0;
}
}
int sum = a[0];
for ( int i = 1; i < k; i++)
{
if (a[i] > 2 * a[i - 1])
{
Console.Write( "-1" );
return ;
}
sum += a[i];
}
if (sum != n) {
Console.Write( "-1" );
return ;
}
for ( int i = 0; i < k; i++)
Console.Write(a[i] + " " );
}
public static void Main()
{
int n = 26, k = 6;
solve(n, k);
}
}
|
PHP
<?php
function solve( $n , $k )
{
$mini = 0;
$x1 = 1;
$a = array ();
for ( $i = 1; $i <= $k ; $i ++)
{
$mini += $x1 ;
$a [ $i - 1] = $x1 ;
$x1 += 1;
}
if ( $n < $mini )
{
echo "-1" ;
return ;
}
$rem = $n - $mini ;
$cnt = floor ( $rem / $k );
$rem = $rem % $k ;
for ( $i = 0; $i < $k ; $i ++)
$a [ $i ] += $cnt ;
for ( $i = $k - 1; $i > 0 && $rem > 0; $i --)
{
$xx = $a [ $i - 1] * 2;
$left = $xx - $a [ $i ];
if ( $rem >= $left )
{
$a [ $i ] = $xx ;
$rem -= $left ;
}
else
{
$a [ $i ] += $rem ;
$rem = 0;
}
}
$sum = $a [0];
for ( $i = 1; $i < $k ; $i ++)
{
if ( $a [ $i ] > 2 * $a [ $i - 1])
{
echo "-1" ;
return ;
}
$sum += $a [ $i ];
}
if ( $sum != $n )
{
echo "-1" ;
return ;
}
for ( $i = 0; $i < $k ; $i ++)
echo $a [ $i ], " " ;
}
$n = 26; $k = 6;
solve( $n , $k );
?>
|
Javascript
<script>
function solve(n, k)
{
let mini = 0;
let x1 = 1;
let a = new Array(k);
for (let i = 1; i <= k; i++) {
mini += x1;
a[i - 1] = x1;
x1 += 1;
}
if (n < mini) {
document.write( "-1" );
return ;
}
let rem = n - mini;
let cnt = parseInt(rem / k);
rem = rem % k;
for (let i = 0; i < k; i++)
a[i] += cnt;
for (let i = k - 1; i > 0 && rem > 0; i--) {
let xx = a[i - 1] * 2;
let left = xx - a[i];
if (rem >= left) {
a[i] = xx;
rem -= left;
}
else {
a[i] += rem;
rem = 0;
}
}
let sum = a[0];
for (let i = 1; i < k; i++) {
if (a[i] > 2 * a[i - 1]) {
document.write( "-1" );
return ;
}
sum += a[i];
}
if (sum != n) {
document.write( "-1" );
return ;
}
for (let i = 0; i < k; i++)
document.write(a[i] + " " );
}
let n = 26, k = 6;
solve(n, k);
</script>
|
Time Complexity: O(K), as there are loops that runs from 0 to (k – 1).
Auxiliary Space: O(K), as no extra space has been taken.
Last Updated :
31 May, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...