TZOJ 2703 Cow Digit Game(sg博弈)

Posted taozi1115402474

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TZOJ 2703 Cow Digit Game(sg博弈)相关的知识,希望对你有一定的参考价值。

描述

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
",sg[a]?"YES":"NO");
24     }
25     return 0;
26 }






以上是关于TZOJ 2703 Cow Digit Game(sg博弈)的主要内容,如果未能解决你的问题,请参考以下文章

P2953 [USACO09OPEN]牛的数字游戏Cow Digit Game

P2953 [USACO09OPEN]牛的数字游戏Cow Digit Game

[bzoj3404] [Usaco2009 Open]Cow Digit Game又见数字游戏

TZOJ 4302 D1-Digit Divisibility DFS

[BZOJ1666][Usaco2006 Oct]Another Cow Number Game 奶牛的数字游戏

2019/10/27 TZOJ