基础的NIM博弈,系统学习博弈的话推荐去看:http://blog.csdn.net/acm_cxlove/article/details/7854530 原帖里讲的很清晰。
这两题都是取到最后一个的为负,所以必胜态为S2,S1,T0,读取的时候求一下亦或并且统计一下富余堆的数量就可以了。
1907:
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <cstring> using namespace std; typedef long long ll; int n,m; int ans; int main() { int tt; // freopen("in.txt","r",stdin); scanf("%d",&tt); while(tt--) { scanf("%d",&n); int rich=0; ans=0; for (int i=1; i<=n; i++) { scanf("%d",&m); ans^=m; if (m>1) rich++; } if (rich>=1) { if (ans==0) puts("Brother"); else puts("John"); } else { if (ans==0) puts("John"); else puts("Brother"); } } return 0; }
2509
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <cstring> using namespace std; typedef long long ll; int n,m; int ans; int main() { // freopen("in.txt","r",stdin); while(~scanf("%d",&n)) { int rich=0; ans=0; for (int i=1; i<=n; i++) { scanf("%d",&m); ans^=m; if (m>1) rich++; } if (rich>=1) { if (ans==0) puts("No"); else puts("Yes"); } else { if (ans!=0) puts("No"); else puts("Yes"); } } return 0; }