http://acm.hdu.edu.cn/showproblem.php?pid=4994
Nim游戏变成从前往后有序的,谁是winner?
如果当前堆数目为1,玩家没有选择,只能取走。遇到到不为1的堆,则当前回合行动者可以选择下次选择的先后手。考虑之后的状态为S,如果S为必败态,则玩家可以取完当前堆,下轮变后手,否则,将当前堆数目变为1,下轮先手。
#include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <string> #include <queue> #include <map> #include <iostream> #include <algorithm> using namespace std; #define RD(x) scanf("%d",&x) #define RD2(x,y) scanf("%d%d",&x,&y) #define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z) #define clr0(x) memset(x,0,sizeof(x)) typedef long long LL; int n,x; int main() { int _;RD(_);while(_--){ RD(n); int ans = 0,x,flag = 0; for(int i = 0;i < n;++i){ RD(x); if(x > 1) flag = 1; if(!flag) ans++; } if(flag){ if(ans&1) puts("No"); else puts("Yes"); } else{ if(ans&1) puts("Yes"); else puts("No"); } } return 0; }