C++--ACM之杭电OJ--2509 By the Winner

经典的尼姆问题是谁哪拿到最后一个则谁赢,本题是拿最后一个的输。
下面分析第二种情况:
1.初始给的是奇异局势的话,则先取者拿到最后一个为输。
2.初始给的是非奇异局势的话,则先取者为赢。
对于任何奇异局势(a,b,c),都有a^b^c=0(^是代表异或).
非奇异局势(a,b,c)(a

#include
using namespace std;
int main()
{
    int n;
    int sum;
    int m[101];
    int i;
    int f;
    while(cin>>n)
    {
        sum=0;
        f=0;
        for(i=1;i<=n;i++)
        {
            cin>>m[i];
            sum^=m[i];                             //位运算,判断是否为奇局势
            if(m[i]>1) f=1;
        }
        if(f==0)                                       //每堆均为  1 
        {
            if(n%2==0) cout<<"Yes"<//n位偶数 先取者必赢
            else cout<<"No"<//n为奇数 先取者输
        }
        else         
        {                                                               //不都为1
            if(sum==0) cout<<"No"<//奇局势 先取者必输
            else cout<<"Yes"<//偶局势 先取者必赢
        }
    }
    return 0;
}

你可能感兴趣的:(C++--ACM)