3404: [Usaco2009 Open]Cow Digit Game又见数字游戏
Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 72 Solved: 48[][][]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.
Source
题解:很萌的博弈论问题。。。但是我还是在读题上逗比了N次——第一次我以为每次可以减去 1-最大的位数 ;第二次我以为可以减去 最小的位数-最大的位数 ;直到第三次才发现只可以减去最大位数和最小位数。。。别的没了,博弈论经典算法AC之
PS:不过虽然AC了,但是2800ms+,时限为3s,这个速度比较滚粗,于是本人打算明天再来一发优化题解么么哒!!!
1 /************************************************************** 2 Problem: 3404 3 User: HansBug 4 Language: Pascal 5 Result: Accepted 6 Time:2804 ms 7 Memory:9992 kb 8 ****************************************************************/ 9 10 var11 i,j,k,l,m,n,t:longint;12 a:array[0..1000005,1..2] of boolean;13 b:array[0..1000005,1..2] of longint;14 function max(x,y:longint):longint;15 begin16 if x>y then max:=x else max:=y;17 end;18 function min(x,y:longint):longint;19 begin20 if x0 do28 begin29 k:=max(k,j mod 10);30 if (j mod 10)>0 then t:=min(t,j mod 10);31 j:=j div 10;32 end;33 a[i,1]:=false;34 if a[i-t,2] then a[i,1]:=true;35 if a[i-k,2] then a[i,1]:=true;36 a[i,2]:=true;37 if not(a[i-t,1]) then a[i,2]:=false;38 if not(a[i-k,1]) then a[i,2]:=false;39 end;40 readln(n);41 for i:=1 to n do42 begin43 readln(m);44 if a[m,1] then writeln('YES') else writeln('NO');45 end;46 readln;47 end.