Dada una string binaria S de longitud N , la tarea es encontrar el ganador del juego si dos jugadores A y B juegan de manera óptima según las siguientes reglas:
- El jugador A siempre comienza el juego.
- En el primer turno de un jugador, puede moverse a cualquier índice ( indexación basada en 1 ) que consista en ‘0’ y convertirlo en ‘1’ .
- Para los turnos subsiguientes, si algún jugador está en el índice i , puede moverse a uno de sus índices adyacentes, si contiene 0 , y convertirlo en ‘1’ después de moverse.
- Si algún jugador no puede moverse a ninguna posición durante su turno, entonces el jugador pierde el juego.
La tarea es encontrar al ganador del juego.
Ejemplos:
Entrada: S = “1100011”
Salida: Jugador A
Explicación:
Los índices 3, 4 y 5 consisten en 0 y los índices 1, 2, 6 y 7 consisten en 1.
A comienza volteando el carácter en el índice 4.
B voltea el índice 3 o el 5.
A ahora solo le queda un índice adyacente al 4, que B no eligió. Después de que A voltea el carácter en ese índice, B no tiene ningún carácter para voltear. Como B no tiene movimientos, A gana.
Por lo tanto, imprime «Jugador A».Entrada: S = “11111”
Salida: Jugador B
Enfoque: la idea es almacenar la longitud de todas las substrings que consisten solo en 0 de la array dada arr[] en otra array, digamos V[] . Ahora bien, se presentan los siguientes casos:
- Si el tamaño de V es 0 : En este caso, la array no contiene ningún 0 . Por lo tanto, el jugador A no puede realizar ningún movimiento y pierde el juego. Por lo tanto, imprima Player B .
- Si el tamaño de V es 1 : en este caso, hay 1 substring que consta solo de 0 , digamos delongitud L. Si el valor de L es impar , entonces el jugador A gana el juego. De lo contrario, el jugador B gana el juego.
- En todos los demás casos: almacene la longitud del segmento consecutivo más grande y el segundo más grande de 0 s en primero y segundo respectivamente. El jugador A puede ganar el juego si y solo si el valor de primero es impar y (primero + 1)/2 > segundo . De lo contrario, el jugador B gana el juego.
A continuación se muestra la implementación del enfoque anterior:
C++
// C++ program for the above approach #include <bits/stdc++.h> using namespace std; // Function to check if player A wins // the game or not void findWinner(string a, int n) { // Stores size of the groups of 0s vector<int> v; // Stores size of the group of 0s int c = 0; // Traverse the array for (int i = 0; i < n; i++) { // Increment c by 1 if a[i] is 0 if (a[i] == '0') { c++; } // Otherwise, push the size // in array and reset c to 0 else { if (c != 0) v.push_back(c); c = 0; } } if (c != 0) v.push_back(c); // If there is no substring of // odd length consisting only of 0s if (v.size() == 0) { cout << "Player B"; return; } // If there is only 1 substring of // odd length consisting only of 0s if (v.size() == 1) { if (v[0] & 1) cout << "Player A"; // Otherwise else cout << "Player B"; return; } // Stores the size of the largest // and second largest substrings of 0s int first = INT_MIN; int second = INT_MIN; // Traverse the array v[] for (int i = 0; i < v.size(); i++) { // If current element is greater // than first, then update both // first and second if (a[i] > first) { second = first; first = a[i]; } // If arr[i] is in between // first and second, then // update second else if (a[i] > second && a[i] != first) second = a[i]; } // If the condition is satisfied if ((first & 1) && (first + 1) / 2 > second) cout << "Player A"; else cout << "Player B"; } // Driver Code int main() { string S = "1100011"; int N = S.length(); findWinner(S, N); return 0; }
Java
// Java program for the above approach import java.util.*; public class GFG { // Function to check if player A wins // the game or not static void findWinner(String a, int n) { // Stores size of the groups of 0s Vector<Integer> v = new Vector<Integer>(); // Stores size of the group of 0s int c = 0; // Traverse the array for (int i = 0; i < n; i++) { // Increment c by 1 if a[i] is 0 if (a.charAt(i) == '0') { c++; } // Otherwise, push the size // in array and reset c to 0 else { if (c != 0) v.add(c); c = 0; } } if (c != 0) v.add(c); // If there is no substring of // odd length consisting only of 0s if (v.size() == 0) { System.out.print("Player B"); return; } // If there is only 1 substring of // odd length consisting only of 0s if (v.size() == 1) { if ((v.get(0) & 1) != 0) System.out.print("Player A"); // Otherwise else System.out.print("Player B"); return; } // Stores the size of the largest // and second largest substrings of 0s int first = Integer.MIN_VALUE; int second = Integer.MIN_VALUE; // Traverse the array v[] for (int i = 0; i < v.size(); i++) { // If current element is greater // than first, then update both // first and second if (a.charAt(i) > first) { second = first; first = a.charAt(i); } // If arr[i] is in between // first and second, then // update second else if (a.charAt(i) > second && a.charAt(i) != first) second = a.charAt(i); } // If the condition is satisfied if ((first & 1) != 0 && (first + 1) / 2 > second) System.out.print("Player A"); else System.out.print("Player B"); } // Driver code public static void main(String[] args) { String S = "1100011"; int N = S.length(); findWinner(S, N); } } // This code is contributed by divyeshrabadiya07.
Python3
# Python3 program for the above approach import sys # Function to check if player A wins # the game or not def findWinner(a, n) : # Stores size of the groups of 0s v = [] # Stores size of the group of 0s c = 0 # Traverse the array for i in range(0, n) : # Increment c by 1 if a[i] is 0 if (a[i] == '0') : c += 1 # Otherwise, push the size # in array and reset c to 0 else : if (c != 0) : v.append(c) c = 0 if (c != 0) : v.append(c) # If there is no substring of # odd length consisting only of 0s if (len(v) == 0) : print("Player B", end = "") return # If there is only 1 substring of # odd length consisting only of 0s if (len(v) == 1) : if ((v[0] & 1) != 0) : print("Player A", end = "") # Otherwise else : print("Player B", end = "") return # Stores the size of the largest # and second largest substrings of 0s first = sys.minsize second = sys.minsize # Traverse the array v[] for i in range(len(v)) : # If current element is greater # than first, then update both # first and second if (a[i] > first) : second = first first = a[i] # If arr[i] is in between # first and second, then # update second elif (a[i] > second and a[i] != first) : second = a[i] # If the condition is satisfied if (((first & 1) != 0) and (first + 1) // 2 > second) : print("Player A", end = "") else : print("Player B", end = "") S = "1100011" N = len(S) findWinner(S, N) # This code is contributed by divyesh072019.
C#
// C# program to implement // the above approach using System; using System.Collections.Generic; using System.Linq; class GFG{ // Function to check if player A wins // the game or not static void findWinner(string a, int n) { // Stores size of the groups of 0s List<int> v = new List<int>(); // Stores size of the group of 0s int c = 0; // Traverse the array for (int i = 0; i < n; i++) { // Increment c by 1 if a[i] is 0 if (a[i] == '0') { c++; } // Otherwise, push the size // in array and reset c to 0 else { if (c != 0) v.Add(c); c = 0; } } if (c != 0) v.Add(c); // If there is no substring of // odd length consisting only of 0s if (v.Count == 0) { Console.Write("Player B"); return; } // If there is only 1 substring of // odd length consisting only of 0s if (v.Count == 1) { if ((v[0] & 1) != 0) Console.Write("Player A"); // Otherwise else Console.Write("Player B"); return; } // Stores the size of the largest // and second largest substrings of 0s int first = Int32.MinValue; int second = Int32.MinValue; // Traverse the array v[] for (int i = 0; i < v.Count; i++) { // If current element is greater // than first, then update both // first and second if (a[i] > first) { second = first; first = a[i]; } // If arr[i] is in between // first and second, then // update second else if (a[i] > second && a[i] != first) second = a[i]; } // If the condition is satisfied if ((first & 1) != 0 && (first + 1) / 2 > second) Console.Write("Player A"); else Console.Write("Player B"); } // Driver Code public static void Main(String[] args) { string S = "1100011"; int N = S.Length; findWinner(S, N); } } // This code is contributed by splevel62.
Javascript
<script> // Javascript program to implement the above approach // Function to check if player A wins // the game or not function findWinner(a, n) { // Stores size of the groups of 0s let v = []; // Stores size of the group of 0s let c = 0; // Traverse the array for (let i = 0; i < n; i++) { // Increment c by 1 if a[i] is 0 if (a[i] == '0') { c++; } // Otherwise, push the size // in array and reset c to 0 else { if (c != 0) v.push(c); c = 0; } } if (c != 0) v.push(c); // If there is no substring of // odd length consisting only of 0s if (v.length == 0) { document.write("Player B"); return; } // If there is only 1 substring of // odd length consisting only of 0s if (v.length == 1) { if ((v[0] & 1) != 0) document.write("Player A"); // Otherwise else document.write("Player B"); return; } // Stores the size of the largest // and second largest substrings of 0s let first = Number.MIN_VALUE; let second = Number.MIN_VALUE; // Traverse the array v[] for (let i = 0; i < v.length; i++) { // If current element is greater // than first, then update both // first and second if (a[i] > first) { second = first; first = a[i]; } // If arr[i] is in between // first and second, then // update second else if (a[i] > second && a[i] != first) second = a[i]; } // If the condition is satisfied if ((first & 1) != 0 && parseInt((first + 1) / 2, 10) > second) document.write("Player A"); else document.write("Player B"); } let S = "1100011"; let N = S.length; findWinner(S, N); // This code is contributed by suresh07. </script>
Player A
Complejidad temporal: O(N)
Espacio auxiliar: O(N)
Publicación traducida automáticamente
Artículo escrito por vermashivani543 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA