描述
Bessie is playing a number game against Farmer John, and she wants you to help her achieve victory.
Game i starts with an integer N_i (1 <= N_i <= 1,000,000). Bessie goes first, and then the two players alternate turns. On each turn, a player can subtract either the largest digit or the smallest non-zero digit from the current number to obtain a new number. For example, from 3014 we may subtract either 1 or 4 to obtain either 3013 or 3010, respectively. The game continues until the number becomes 0, at which point the last player to have taken a turn is the winner.
Bessie and FJ play G (1 <= G <= 100) games. Determine, for each game, whether Bessie or FJ will win, assuming that both play perfectly (that is, on each turn, if the current player has a move that will guarantee his or her win, he or she will take it).
Consider a sample game where N_i = 13. Bessie goes first and takes 3, leaving 10. FJ is forced to take 1, leaving 9. Bessie takes the remainder and wins the game.
输入
* Line 1: A single integer: G
* Lines 2..G+1: Line i+1 contains the single integer: N_i
输出
* Lines 1..G: Line i contains "YES" if Bessie can win game i, and "NO" otherwise.
样例输入
2
9
10
样例输出
YES
NO
提示
OUTPUT DETAILS:
For the first game, Bessie simply takes the number 9 and wins. For the second game, Bessie must take 1 (since she cannot take 0), and then FJ can win by taking 9.
题意
A和B在玩游戏,给一个数a,轮到A,可以把数变成a-最大的数,a-最小的非零数,B同理,谁把值变成0谁赢
题解
观察一下可以发现,只要知道a-最大的数的sg值和a-最小的非零数的sg值,再异或1就是答案
因为先手只可以选最大或最小,后面不管怎么拿都是定死了
代码
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int sg[1000005],n,a,t,mx,mi; 5 void m(int x) 6 { 7 mx=-1,mi=10; 8 do{ 9 t=x%10; 10 if(t)mx=max(mx,t); 11 if(t)mi=min(mi,t); 12 x/=10; 13 }while(x); 14 } 15 int main() 16 { 17 sg[0]=0; 18 for(int i=1;i<=1000000;i++)m(i),sg[i]=(sg[i-mx]^1)|(sg[i-mi]^1); 19 scanf("%d",&n); 20 while(n--) 21 { 22 scanf("%d",&a); 23 printf("%s\n",sg[a]?"YES":"NO"); 24 } 25 return 0; 26 }
原文地址:https://www.cnblogs.com/taozi1115402474/p/10306547.html