尼姆博弈

学习: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;
}
View Code

 题: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;
}
View Code

题: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;
}
View Code

 

posted @ 2019-10-31 13:45  starve_to_death  阅读(125)  评论(0编辑  收藏  举报