Given two integers X and Y representing the number of candies allocated to players A and B respectively, where both the players indulge in a game of donating i candies to the opponent in every ith move. Starting with player A, the game continues with alternate turns until a player is unable to donate the required amount of candies and loses the game, the task is to find the winner of the game.
Examples:
Input: X = 2, Y = 3
Output: A
Explanation: The game turns out in the following manner:
Step
X
Y
0
2
3
1
1
4
2
3
2
3
0
5
4
4
1
Since A fails to donate 5 candies in the 5th step, B wins the game.
Input: X = 2, Y = 1
Output: B
Explanation: The game turns out in the following manner:
Step X Y 0 2 1 1 1 2 2 3 0 3 0 3 Since B fails to give 4 candies in the 4th step, A wins the game.
Approach: The idea is to solve the problem based on the following observation:
Step
Number of candies
Possessed by ANumber of candies
Possessed by B0
X
Y
1
X – 1
Y + 1
2
X – 1 + 2 = X + 1
Y + 1 – 2 = Y – 1
3
X – 2
Y + 2
4
X + 2
Y – 2
- The player whose candies reduce to 0 first, will not be having enough candies to give in the next move.
- Count of candies of player A decreases by 1 in odd moves.
- Count of candies of player B decreases by 1 in even moves.
Follow the steps below to solve the problem:
- Initialize two variables, say chanceA and chanceB, representing the number of moves in which the number of candies possessed by a player reduces to 0.
- Since count of candies of player A decreases by 1 in odd moves, chanceA = 2 * (X – 1) + 1
- Since count of candies of player B decreases by 1 in even moves, chanceB = 2 * Y
- If chanceA < chanceB, then B will be the winning player.
- Otherwise, A will be the winning player.
- Print the winning player.
Below is the implementation of the above approach:
C++
// C++ Program for the // above approach #include <bits/stdc++.h> using namespace std; // Function to find the winning // player in a game of donating i // candies to opponent in i-th move int stepscount( int a, int b) { // Steps in which number of // candies of player A finishes int chanceA = 2 * a - 1; // Steps in which number of // candies of player B finishes int chanceB = 2 * b; // If A's candies finishes first if (chanceA < chanceB) { cout << "B" ; } // Otherwise else if (chanceB < chanceA) { cout << "A" ; } return 0; } // Driver Code int main() { // Input // Candies possessed // by player A int A = 2; // Candies possessed // by player B int B = 3; stepscount(A, B); return 0; } |
Java
// Java Program for above approach class GFG{ // Function to find the winning // player in a game of donating i // candies to opponent in i-th move static void stepscount( int a, int b) { // Steps in which number of // candies of player A finishes int chanceA = 2 * a - 1 ; // Steps in which number of // candies of player B finishes int chanceB = 2 * b; // If A's candies finishes first if (chanceA < chanceB) { System.out.print( "B" ); } // Otherwise else if (chanceB < chanceA) { System.out.print( "A" ); } } // Driver code public static void main(String[] args) { // Input // Candies possessed by player A int A = 2 ; // Candies possessed by player B int B = 3 ; stepscount(A, B); } } // This code is contributed by abhinavjain194 |
Python3
# Python3 program for the above approach # Function to find the winning # player in a game of donating i # candies to opponent in i-th move def stepscount(a, b): # Steps in which number of # candies of player A finishes chance_A = 2 * a - 1 # Steps in which number of # candies of player B finishes chance_B = 2 * b # If A's candies finishes first if (chance_A < chance_B): return 'B' # Otherwise else : return "A" # Driver code # Candies possessed by player A A = 2 # Candies possessed by player B B = 3 print (stepscount(A, B)) # This code is contributed by abhinavjain194 |
C#
// C# program for the above approach using System; class GFG{ // Function to find the winning // player in a game of donating i // candies to opponent in i-th move static void stepscount( int a, int b) { // Steps in which number of // candies of player A finishes int chanceA = 2 * a - 1; // Steps in which number of // candies of player B finishes int chanceB = 2 * b; // If A's candies finishes first if (chanceA < chanceB) { Console.Write( "B" ); } // Otherwise else if (chanceB < chanceA) { Console.Write( "A" ); } } // Driver code static void Main() { // Input // Candies possessed by player A int A = 2; // Candies possessed by player B int B = 3; stepscount(A, B); } } // This code is contributed by abhinavjain194 |
Javascript
<script> // Javascript program for the above approach // Function to find the winning // player in a game of donating i // candies to opponent in i-th move function stepscount( a, b) { // Steps in which number of // candies of player A finishes let chanceA = 2 * a - 1; // Steps in which number of // candies of player B finishes ;let chanceB = 2 * b; // If A's candies finishes first if (chanceA < chanceB) { document.write( "B" ); } // Otherwise else if (chanceB < chanceA) { document.write( "A" ); } return 0; } // Driver Code // Input // Candies possessed // by player A let A = 2; // Candies possessed // by player B let B = 3; stepscount(A, B); </script> |
B
Time Complexity: O(1)
Auxiliary Space: O(1)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!