尼姆博弈
学习:https://blog.csdn.net/BBHHTT/article/details/80199541
题:http://acm.hdu.edu.cn/showproblem.php?pid=1850
#include<iostream> #include<cstdio> using namespace std; int a[200]; int main(){ int n; while(~scanf("%d",&n)){ if(n==0) break; int ans=0,coutt=0;; for(int x,i=1;i<=n;i++) cin>>a[i],ans^=a[i]; //只要对 c进行 c-(a XOR b)这样的运算即可 for(int i=1;i<=n;i++){ if(a[i]>(a[i]^ans)) coutt++; } cout<<coutt<<endl; } return 0; }
题:http://poj.org/problem?id=2234
#include<iostream> #include<cstdio> using namespace std; int a[200]; int main(){ int n; while(~scanf("%d",&n)){ int ans=0; for(int x,i=1;i<=n;i++) cin>>x,ans^=x; if(ans) puts("Yes"); else puts("No"); } return 0; }
题:http://acm.hdu.edu.cn/showproblem.php?pid=1907
思路:尼姆博奕 :先取走赢跟先取走输
都是抑或和 = 0 先手输了
只是先取走输要特判都是1的时候
#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> using namespace std; int main(){ int t; cin>>t; while(t--){ int ans=0; int n; cin>>n; int flag=0; for(int x,i=1;i<=n;i++){ cin>>x; if(x!=1) flag=1; ans^=x; } if(flag){ if(!ans) puts("Brother"); else puts("John"); } else{ // cout<<"##"<<endl; if(ans) puts("Brother"); else puts("John"); } } return 0; }