Find the position of box which occupies the given ball
Last Updated :
08 Jun, 2022
Given two array A[] and B[]. Where size of A[] represent the number of rows and A[i] represent the number of boxes in the ith row. Array B[] represents an array of balls where B[i] represents a number on the ball. Given that ball i (having value B[i]) will be placed in a box whose position from beginning is B[i] (row-major). The task is to find the row and column of the boxes corresponding to each B[i].
Examples:
Input: A[] = {2, 3, 4, 5}, B[] = {1, 4, 6, 3}
Output:
1, 1
2, 2
3, 1
2, 1
B[0] = 1, hence Box position will be 1st row, 1st column
B[1] = 4, hence Box position will be 2nd row, 2nd column
B[2] = 6, hence Box position will be 3rd row, 1st column
B[3] = 3, hence Box position will be 2nd row, 1st column
Input: A[] = {2, 2, 2, 2}, B[] = {1, 2, 3, 4}
Output:
1, 1
1, 2
2, 1
2, 2
Approach: As per problem statement, in 1st row A[0] number of boxes are placed similarly in 2nd row A[1] number of boxes are there. So, in case a ball is to be placed in any box of the second row, its value must be greater than A[0]. So, for finding the actual position of box where a ball B[i] is going to be placed first of all find the cumulative sum of array A[] and then find the position of element in cumulative sum array which is just greater than B[i], that will be the row number and for finding the box number in that particular row find the value of B[i] – value in cumulative array which is just smaller than B[i].
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void printPosition( int A[], int B[], int sizeOfA, int sizeOfB)
{
for ( int i = 1; i < sizeOfA; i++)
A[i] += A[i - 1];
for ( int i = 0; i < sizeOfB; i++) {
int row = lower_bound(A, A + sizeOfA, B[i]) - A;
int boxNumber = (row >= 1) ? B[i] - A[row - 1] : B[i];
cout << row + 1 << ", " << boxNumber << "\n" ;
}
}
int main()
{
int A[] = { 2, 2, 2, 2 };
int B[] = { 1, 2, 3, 4 };
int sizeOfA = sizeof (A) / sizeof (A[0]);
int sizeOfB = sizeof (B) / sizeof (B[0]);
printPosition(A, B, sizeOfA, sizeOfB);
return 0;
}
|
Java
class GFG
{
static void printPosition( int A[], int B[],
int sizeOfA, int sizeOfB)
{
for ( int i = 1 ; i < sizeOfA; i++)
{
A[i] += A[i - 1 ];
}
for ( int i = 0 ; i < sizeOfB; i++)
{
int row = lower_bound(A, 0 , A.length, B[i]);
int boxNumber = (row >= 1 ) ? B[i] - A[row - 1 ] : B[i];
System.out.print(row + 1 + ", " + boxNumber + "\n" );
}
}
private static int lower_bound( int [] a, int low, int high, int element)
{
while (low < high)
{
int middle = low + (high - low) / 2 ;
if (element > a[middle])
{
low = middle + 1 ;
}
else
{
high = middle;
}
}
return low;
}
public static void main(String[] args)
{
int A[] = { 2 , 2 , 2 , 2 };
int B[] = { 1 , 2 , 3 , 4 };
int sizeOfA = A.length;
int sizeOfB = B.length;
printPosition(A, B, sizeOfA, sizeOfB);
}
}
|
Python3
import bisect
def printPosition(A, B, sizeOfA, sizeOfB):
for i in range ( 1 , sizeOfA):
A[i] + = A[i - 1 ]
for i in range (sizeOfB):
row = bisect.bisect_left(A, B[i])
if row > = 1 :
boxNumber = B[i] - A[row - 1 ]
else :
boxNumber = B[i]
print (row + 1 , "," , boxNumber)
A = [ 2 , 2 , 2 , 2 ]
B = [ 1 , 2 , 3 , 4 ]
sizeOfA = len (A)
sizeOfB = len (B)
printPosition(A, B, sizeOfA, sizeOfB)
|
C#
using System;
class GFG
{
static void printPosition( int []A, int []B,
int sizeOfA, int sizeOfB)
{
for ( int i = 1; i < sizeOfA; i++)
{
A[i] += A[i - 1];
}
for ( int i = 0; i < sizeOfB; i++)
{
int row = lower_bound(A, 0, A.Length, B[i]);
int boxNumber = (row >= 1) ? B[i] - A[row - 1] : B[i];
Console.WriteLine(row + 1 + ", " + boxNumber + "\n" );
}
}
private static int lower_bound( int [] a, int low,
int high, int element)
{
while (low < high)
{
int middle = low + (high - low) / 2;
if (element > a[middle])
{
low = middle + 1;
}
else
{
high = middle;
}
}
return low;
}
static public void Main ()
{
int []A = {2, 2, 2, 2};
int []B = {1, 2, 3, 4};
int sizeOfA = A.Length;
int sizeOfB = B.Length;
printPosition(A, B, sizeOfA, sizeOfB);
}
}
|
PHP
<?php
function lower_bound( $A , $valueTosearch )
{
$row = 0;
foreach ( $A as $key => $value )
{
if ( $valueTosearch <= $value )
return $row ;
$row ++;
}
return $row +1;
}
function printPosition( $A , $B , $sizeOfA , $sizeOfB )
{
for ( $i = 1; $i < $sizeOfA ; $i ++)
$A [ $i ] += $A [ $i - 1];
for ( $i = 0; $i < $sizeOfB ; $i ++)
{
$row = lower_bound( $A , $B [ $i ]) ;
$boxNumber = ( $row >= 1) ? $B [ $i ] - $A [ $row - 1] : $B [ $i ];
print_r( $row +1 . ", " . $boxNumber );
echo "\n" ;
}
}
$A = array (2, 2, 2, 2 );
$B = array ( 1, 2, 3, 4 );
$sizeOfA = count ( $A );
$sizeOfB = count ( $B );
printPosition( $A , $B , $sizeOfA , $sizeOfB );
?>
|
Javascript
<script>
function printPosition(A , B , sizeOfA , sizeOfB) {
for (i = 1; i < sizeOfA; i++) {
A[i] += A[i - 1];
}
for (i = 0; i < sizeOfB; i++) {
var row = lower_bound(A, 0, A.length, B[i]);
var boxNumber = (row >= 1) ? B[i] - A[row - 1] : B[i];
document.write(row + 1 + ", " + boxNumber + "<br/>" );
}
}
function lower_bound(a , low , high , element) {
while (low < high) {
var middle = low + (high - low) / 2;
if (element > a[middle]) {
low = middle + 1;
} else {
high = middle;
}
}
return low;
}
var A = [ 2, 2, 2, 2 ];
var B = [ 1, 2, 3, 4 ];
var sizeOfA = A.length;
var sizeOfB = B.length;
printPosition(A, B, sizeOfA, sizeOfB);
</script>
|
Output:
1, 1
1, 2
2, 1
2, 2
Time Complexity: O(sizeOfA + sizeOfB)
Auxiliary Space: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...