Encuentra el último jugador que pueda voltear un personaje en una string binaria

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:

  1. 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 .
  2. 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.
  3. 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>
Producción: 

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *