Find the winner of a game of donating i candies in every ith move (original) (raw)

Last Updated : 25 May, 2021

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 candiesPossessed by A Number of candiesPossessed by B
0 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

Follow the steps below to solve the problem**:**

  1. 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.
  2. Since count of candies of player A decreases by 1 in odd moves, chanceA = 2 * (X - 1) + 1
  3. Since count of candies of player B decreases by 1 in even moves, chanceB = 2 * Y
  4. If chanceA < chanceB, then B will be the winning player.
  5. Otherwise, A will be the winning player.
  6. 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

`

Time Complexity: O(1)
Auxiliary Space: O(1)