两个玩家player1和player2正在以给定的编号序列S进行游戏,其中玩家1首先开始,并且他们两个都玩得很尽兴。任务是确定玩家1是赢还是输。如果他赢了,则打印“是”,否则打印“否”。
游戏规则如下:
- 玩家的交替回合。
- 在每个回合中,当前玩家必须选择当前序列S中的一个或多个元素,以使所有选定元素的值都相同,并从S中删除这些元素。
- 当玩家无法选择任何东西时(序列S已经为空),该玩家将输掉游戏。
例子:
Input: S = {2, 1, 2, 2}
Output: Yes
Explanation:
The first player can choose the subset of elements with indices {0, 3} {0, 2} or {2, 3} (in the sequence) to ensure his victory in the future.
Input: S = {3, 2, 2, 3, 3, 5}
Output:No
Explanation:
The first player can not win in this sequence.
If player1 chooses 2 and remove all the 2 from sequence then player2 will choose two 3 and remove only two 3 as both players play optimally.
Then player1 removes either 3 or 5 and player2 will remove the final element. So player1 will always lose.
方法:可以给出上述问题的方法,就好像顺序中的元素总数是偶数,而且出现多次的元素数也是偶数时,第一个玩家就无法获胜。如果出现不止一次的元素数量为奇数,并且重复出现的元素的数量大于或等于4且是2的倍数,则第一个玩家无法获胜。否则, player1可以成为赢家。
下面是上述方法的实现:
C++
// C++ implementation for Two player
// game in which a player can remove
// all occurrences of a number
#include
using namespace std;
// Function that print whether
// player1 can wins or loses
void game(int v[], int n)
{
unordered_map m;
// storing the number of occurrence
// of elements in unordered map
for (int i = 0; i < n; i++) {
if (m.find(v[i]) == m.end())
m[v[i]] = 1;
else
m[v[i]]++;
}
int count = 0;
// variable to check if the
// occurrence of repeated
// elements is >= 4 and
// multiple of 2 or not
int check = 0;
// count elements which
// occur more than once
for (auto i: m) {
if (i.second > 1) {
if (i.second >= 4
&& i.second % 2 == 0)
check++;
count++;
}
}
if (check % 2 != 0)
bool flag = false;
if (check % 2 != 0)
cout << "Yes" << endl;
else if (n % 2 == 0
&& count % 2 == 0)
cout << "No" << endl;
else
cout << "Yes" << endl;
}
// Driver code
int main()
{
int arr[] = { 3, 2, 2, 3, 3, 5 };
int size = sizeof(arr)
/ sizeof(arr[0]);
game(arr, size);
return 0;
}
Java
// Java implementation for Two player
// game in which a player can remove
// all occurrences of a number
import java.util.*;
class GFG{
// Function that print whether
// player1 can wins or loses
public static void game(int[] v,
int n)
{
HashMap m = new HashMap<>();
// Storing the number of occurrence
// of elements in unordered map
for (int i = 0; i < n; i++)
{
if (!m.containsKey(v[i]))
m.put(v[i], 1);
else
m.replace(v[i], m.get(v[i]) + 1);
}
int count = 0;
// variable to check if the
// occurrence of repeated
// elements is >= 4 and
// multiple of 2 or not
int check = 0;
// count elements which
// occur more than once
for (Map.Entry i : m.entrySet())
{
if(i.getValue() > 1)
{
if(i.getValue() >= 4 &&
i.getValue() % 2 == 0)
check++;
count++;
}
}
boolean flag;
if (check % 2 != 0)
flag = false;
if (check % 2 != 0)
System.out.println("Yes");
else if (n % 2 == 0 &&
count % 2 == 0)
System.out.println("No");
else
System.out.println("Yes");
}
public static void main(String[] args)
{
int[] arr = {3, 2, 2, 3, 3, 5};
int size = arr.length;
game(arr, size);
}
}
// This code is contributed by divyeshrabadiya07
Python3
# Python3 implementation for two player
# game in which a player can remove
# all occurrences of a number
from collections import defaultdict
# Function that print whether
# player1 can wins or loses
def game(v, n):
m = defaultdict(int)
# Storing the number of occurrence
# of elements in unordered map
for i in range(n):
if (v[i] not in m):
m[v[i]] = 1
else:
m[v[i]] += 1
count = 0
# Variable to check if the
# occurrence of repeated
# elements is >= 4 and
# multiple of 2 or not
check = 0
# Count elements which
# occur more than once
for i in m.values():
if (i > 1):
if (i >= 4 and i % 2 == 0):
check += 1
count += 1
if (check % 2 != 0):
flag = False
if (check % 2 != 0):
print("Yes")
elif (n % 2 == 0 and count % 2 == 0):
print("No")
else:
print("Yes")
# Driver code
if __name__ == "__main__":
arr = [ 3, 2, 2, 3, 3, 5 ]
size = len(arr)
game(arr, size)
# This code is contributed by chitranayal
C#
// C# implementation for Two player
// game in which a player can remove
// all occurrences of a number
using System;
using System.Collections.Generic;
class GFG{
// Function that print whether
// player1 can wins or loses
public static void game(int[] v,
int n)
{
Dictionary m = new Dictionary();
// Storing the number of occurrence
// of elements in unordered map
for(int i = 0; i < n; i++)
{
if (!m.ContainsKey(v[i]))
m.Add(v[i], 1);
else
m[v[i]]= m[v[i]] + 1;
}
int count = 0;
// Variable to check if the
// occurrence of repeated
// elements is >= 4 and
// multiple of 2 or not
int check = 0;
// Count elements which
// occur more than once
foreach(KeyValuePair i in m)
{
if (i.Value > 1)
{
if (i.Value >= 4 &&
i.Value % 2 == 0)
check++;
count++;
}
}
bool flag;
if (check % 2 != 0)
flag = false;
if (check % 2 != 0)
Console.WriteLine("Yes");
else if (n % 2 == 0 &&
count % 2 == 0)
Console.WriteLine("No");
else
Console.WriteLine("Yes");
}
// Driver code
public static void Main(String[] args)
{
int[] arr = { 3, 2, 2, 3, 3, 5 };
int size = arr.Length;
game(arr, size);
}
}
// This code is contributed by Amit Katiyar
No
时间复杂度:上述方法的复杂度为O(N)。