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

Description

    贝茜和约翰在玩一个数字游戏.贝茜需要你帮助她.
    游戏一共进行了G(1≤G≤100)场.第i场游戏开始于一个正整数Ni(l≤Ni≤1,000,000).游
戏规则是这样的:双方轮流操作,将当前的数字减去一个数,这个数可以是当前数字的最大数码,也可以是最小的非0数码.比如当前的数是3014,操作者可以减去1变成3013,也可以减去4变成3010.若干次操作之后,这个数字会变成0.这时候不能再操作的一方为输家.    贝茜总是先开始操作.如果贝茜和约翰都足够聪明,执行最好的策略.请你计算最后的赢家.
    比如,一场游戏开始于13.贝茜将13减去3变成10.约翰只能将10减去1变成9.贝茜再将9减去9变成0.最后贝茜赢.

Input

    第1行输入一个整数G,之后G行一行输入一个Ni.

Output

 
    对于每一场游戏,若贝茜能赢,则输出一行“YES”,否则输幽一行“NO”

Sample Input

2
9
10

Sample Output

YES
NO

HINT

 

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.

博弈论。。。只要当前点可以转移到必胜态,则该点为必胜的,否则必败。。。。
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 using namespace std;
 7 int a[1000010];
 8 int main()
 9 {
10     int n,m,big=0,small=9;
11     for(int i=1;i<=9;i++) a[i]=1;
12     a[10]=2;
13     for(int i=11;i<=1000000;i++)
14     {
15         int ans=10,t=i;big=0;small=9;
16         for(int j=1;j<=7;j++)
17         {
18             int k=t%ans;
19             if(k>big&&k<10) big=k;if(k<small&&k>0) small=k;
20             t-=k;
21             t=t/10;
22         }
23         if(a[i-big]==2||a[i-small]==2) a[i]=1;
24         else a[i]=2;
25     }
26     scanf("%d",&n);
27     for(int i=1;i<=n;i++)
28     {
29         scanf("%d",&m);
30         if(a[m]==2) printf("%s\n","NO");
31         else printf("%s\n","YES");
32     }
33     return 0;
34 }
View Code

 

posted @ 2015-10-23 21:51  HTWX  阅读(249)  评论(0编辑  收藏  举报