# Kangaroo HackerRank Challenge | C++ Implementation

# Problem:

You are choreographing a circus show with various animals. For one act, you are given two kangaroos o a number line ready to jump in the positive direction (i.e, toward positive infinity).

• The first kangaroo starts at location `x1`

and moves at a rate of `v1`

meters per jump.

• The second kangaroo starts at location `x2`

and moves at a rate of `v2`

meters per jump.

You have to figure out a way to get both kangaroos at the same location at the same time as part of the show. If it is possible, return `YES`

, otherwise return `NO`

.

For example, kangaroo 1 starts at `x1 = 2`

with a jump distance `v1 = 1`

and kangaroo 2 starts at `x2 = 1`

with a jump distance of `v2 = 2`

. After one jump, they are both at `x = 3`

, (`x1 + v1 = 2 + 1`

, `x2 + v2 = 1 + 2`

), so our answer is `YES`

.

Read full problem here - Kangaroo

# Solution:

Here `pos1`

is current position of kangaroo 1 and `pos2`

is current position of kangaroo2. `speed1`

is speed of kangaroo 1 and `speed2`

is speed of kangaroo 2. `difference`

stores the initial difference between their starting positions. The kangaroo whose position is last should cover that distance in `difference`

number of steps because the minimum speed for a kangaroo is `1`

.

1
2
3

std::string no = "NO";
std::string yes = "YES";
int difference = abs(pos1 - pos2);

The next position for kangaroos is `pos1 = pos1 + speed1`

and `pos2 = pos2 + speed2`

. If `pos1`

is equal to `pos2`

means they met and answer is `YES`

.

**Case 1:** When starting positions of both kangaroo are different i.e. `pos1 != pos2`

and `difference != 0`

.

Then a loop will run for `difference`

number of times and in each step their current positions are updated and if their updated current positions are equal then return `YES`

.

1
2
3
4
5
6
7
8
9
10
11
12
13

for (int i = 0; i < difference; ++i)
{
pos1 = pos1 + speed1;
pos2 = pos2 + speed2;
if (pos1 == pos2)
{
return yes;
}
}
if (pos1 != pos2)
{
return no;
}

**Case 2:** When starting positions of both kangaroo are same i.e. `pos1 == pos2`

and `difference == 0`

.

Then next position is calculated `pos1 = pos1 + speed1`

and `pos2 = pos2 + speed2`

and if their speeds are different then new `difference`

is calculated and proceed as case 1. If their speeds are same then they will meet in second step.

1
2
3
4
5
6
7
8
9
10

if (difference == 0 && speed1 != speed2)
{
pos1 = pos1 + speed1;
pos2 = pos2 + speed2;
difference = abs(pos1 - pos2);
}
else if (difference == 0 && speed1 == speed2)
{
return yes;
}

The kangaroos will never meet if the kangaroo whose is ahead has more speed than the last kangaroo.

1
2
3
4

if ((pos1 > pos2 && speed1 > speed2) || (pos2 > pos1 && speed2 > speed1))
{
return no;
}

**Related:** Roy and Code Streak HackerEarth Challenge

### C++ Implementation

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

#include <iostream>
#include <cassert>
#include <string>
std::string does_meet(int pos1, int speed1, int pos2, int speed2)
{
std::string no = "NO";
std::string yes = "YES";
int difference = abs(pos1 - pos2);
if (difference == 0 && speed1 != speed2)
{
pos1 = pos1 + speed1;
pos2 = pos2 + speed2;
difference = abs(pos1 - pos2);
}
else if (difference == 0 && speed1 == speed2)
{
return yes;
}
if ((pos1 > pos2 && speed1 > speed2) || (pos2 > pos1 && speed2 > speed1))
{
return no;
}
else
{
for (int i = 0; i < difference; ++i)
{
pos1 = pos1 + speed1;
pos2 = pos2 + speed2;
if (pos1 == pos2)
{
return yes;
}
}
if (pos1 != pos2)
{
return no;
}
}
return no;
}
int main()
{
int x1, x2, v1, v2;
std::cin >> x1 >> v1 >> x2 >> v2;
std::string result = does_meet(x1, v1, x2, v2);
std::cout << result << "\n";
}

View this code on Github.

Get this post in pdf - Kangaroo-HackerRank Challenge