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
9
10
Sample Output
YES
NO
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 }