码迷,mamicode.com
首页 > 其他好文 > 详细

TZOJ 2703 Cow Digit Game(sg博弈)

时间:2019-01-23 00:22:54      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:until   span   play   ast   star   nat   space   otto   \n   

描述

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 }

TZOJ 2703 Cow Digit Game(sg博弈)

标签:until   span   play   ast   star   nat   space   otto   \n   

原文地址:https://www.cnblogs.com/taozi1115402474/p/10306547.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!