给定一个长度为N的二进制字符串S ,如果两个玩家A和B按照以下规则进行最佳游戏,则任务是找到游戏的获胜者:
- 玩家 A 总是开始游戏。
- 在玩家的第一个回合中,他可以移动到由‘0’组成的任何索引(基于 1 的索引)并使其成为‘1’ 。
- 对于随后的回合,如果任何玩家处于索引i ,那么他可以移动到它的相邻索引之一,如果它包含0 ,并在移动后将其转换为‘1’ 。
- 如果任何玩家在他的回合中无法移动到任何位置,则该玩家输掉游戏。
任务是找到游戏的赢家。
例子:
Input: S = “1100011”
Output: Player A
Explanation:
The indices 3, 4 and 5 consists of 0s and indices 1, 2, 6 and 7 consists of 1s.
A starts by flipping the character at index 4..
B flips either the index 3 or 5.
A is now left with only one index adjacent to 4, which B did not pick. After A flips the character at that index, B does not have any character to flip. Since B has no moves, A wins.
Hence, print “Player A”.
Input: S = “11111”
Output: Player B
方法:这个想法是将给定数组arr[]中仅由0组成的所有子字符串的长度存储在另一个数组中,比如V[] 。现在,出现以下情况:
- 如果 V 的大小为 0 :在这种情况下,数组不包含任何0 。因此,玩家 A不能采取任何行动并输掉比赛。因此,打印Player B 。
- 如果 V 的大小为 1 :在这种情况下,有 1 个仅由0组成的子字符串,例如长度为L 。如果L 的值为奇数,则玩家 A赢得比赛。否则,玩家 B赢得比赛。
- 在所有其他情况下:分别在first和second中存储0 s 的最大和第二大连续段的长度。当且仅当first 的值为奇数且(first + 1)/2 > second 时,玩家 A才能赢得比赛。否则,玩家 B赢得比赛。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
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 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 v = new Vector();
// 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 v = new List();
// 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
Player A
时间复杂度: O(N)
辅助空间: O(N)
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。