给出一个长度为 N的正整数 arr[],你只能对arr[]进行一种操作,即从arr[]中取出两个元素,比方说 arr[i] 和arr[j],使得 0≤i<j≤N-1,并且 arri 应该大于 0 。然后递减arri ,递增arrj。
- 假设,两个玩家X和Y 正在玩这个游戏。那么任务就是打印出如果Y进行了游戏的第一次操作,哪位玩家赢得游戏。无法进行操作的玩家将输掉游戏。
例子。
输入。 N = 4, arr[] = {2, 3, 1, 3}
输出。 Y
解释: 初始arr[]是。{2, 3, 1, 3}
玩家Y通过选择i = 0和j = 1来应用:{1, 4, 1, 3}
玩家X通过选择i = 0和j = 1来应用:{0, 5, 1, 3}
玩家Y通过选择i = 1和j = 2来应用:{0, 4, 2, 3}
玩家X通过选择i = 1和j = 2。{0, 3, 3, 3}
玩家Y通过选择i = 1和j = 2应用:{0, 2, 4, 3}
玩家X通过选择i = 1和j = 2应用:{0, 1, 5, 3}
玩家Y通过选择i = 1和j = 2应用。{0, 0, 6, 3}
选择i = 2和j = 3的玩家X:{0, 0, 5, 4}
选择i = 2和j = 3的玩家Y:{0, 0, 4, 5}
选择i = 2和j = 3的玩家X:{0, 0, 3, 6}
选择i = 2和j = 3的玩家Y。{0, 0, 2, 7}
玩家X通过选择i = 2和j = 3来应用:{0, 0, 1, 8}
玩家Y通过选择i = 2和j = 3来应用:{0, 0, 0, 9}
由于arr[]中已经没有指数i和j了,
以下是0<=i<j<N-1和Ai>0。
因此,玩家X不能进行下一步操作。
因此,玩家Y赢得游戏。输入。 N = 2, arr[] = {0, 1}
输出。 X
解释。 玩家Y不能进行游戏的第一个操作,因此玩家X赢得游戏。
办法。 要解决这个问题,请遵循以下思路。
我们可以看到,游戏中明确提到索引i(0≤i≤N-1) 应该大于 索引 j ,以便 应用操作。因此,通过这一观察,我们可以看到,在输入arr[]中的任何索引i,有N-i-1个可能的位置可以从第1个索引中减去1,然后加到第j个索引。因此,这个游戏被简化为子游戏,与**"尼姆游戏 "类似。**
- 在 尼姆游戏 中 , 赢家是根据 尼姆和 决定的 。 如果Nim-sum不等于0,那么走第一步的玩家就赢了,如果Nim-sum等于0,那么其他玩家就赢了。
- 同样,这个问题与 组合博弈论 有关,并使用 Sprague Grundy模型 来解决这个问题。
- 尼姆游戏只取决于尼姆和,我们有一个XOR属性,即**(A^A)=0.**如果一个元素在索引i处是偶数,那么它在整个尼姆和中的部分将是偶数N-i,否则在整个尼姆和中是奇数N-i。
根据以上三行,我们可以得出结论,要想得到答案,请计算N-i-1与第i个元素的XOR,其中第i个元素在arr[]中是奇数。
如果Nim-Sum为零,则玩家X获胜,否则玩家Y获胜。
请按照以下步骤来解决这个问题。
- 创建任何长类型的变量,例如Z,并将其初始化为0**。**
- 从左到右对**arr[]**进行迭代,如果发现一个元素是奇数,则更新 Z为 Z⊕(N-i-1)。
- 迭代完成后,如果Z=0,则玩家X获胜,否则Y获胜。
- 根据上述步骤中Z的结果值,打印X/Y为赢家。
下面是上述方法的实现。
java
// Java code to implement the approach
import java.io.*;
import java.lang.*;
import java.util.*;
class GFG {
// Driver function
public static void main(String[] args)
{
// Input N which denotes number of
// positive elements in arr[]
int N = 4;
// Input arr[]
int[] arr = { 2, 3, 1, 3 };
// Function call
find_winner(N, arr);
}
// Function which is called in main
static void find_winner(int N, int[] arr)
{
long Z = 0;
// Loop for iterating on arr[]
for (int i = 0; i < N; i++) {
// Checking current iterated
// element is odd or not
if (arr[i] % 2 == 1) {
// Updating value of Z if
// odd element found
Z = Z ^ (N - i - 1);
}
}
// Printing winner by using
// value of Z
if (Z == 0) {
System.out.println("X");
}
else {
System.out.println("Y");
}
}
}
输出
Y
时间复杂度。O(N)
辅助空间。O(1)