Fork me on GitHub

HDU 1850 Being a Good Boy in Spring Festival

此题先考虑第一种,5 7 9的情况,先手如果想赢,则必定要把异或值变为0,因为随便取,所以此处的异或指的是对堆中的石子数进行异或,而非异或其SG函数。

首先7^9=14,因为要异或为0,则5要变成14,这时14^14才使得nim_sum为0,显然这是不可能的,再考虑5^9=12,要7变成12也是不可能的,然后再考虑一,5^7=2,让9变成2是可能的,因为9>2,所以问题转化成,取一堆为孤立堆,其他n-1堆做异或,看此堆的石子数ai是否大于异或值,如果大于则cnt++,然后循环跑个遍就可以了。

 

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>

using namespace std;

int a[104];

int main()
{
    int n,i,j;
    int res;
    int cnt;
    while(scanf("%d",&n)!=EOF&&n)
    {
        cnt=0;
        for(i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
        }
        for(i=0;i<n;i++)
        {
            res = 0;
            for(j=0;j<n;j++)
            {
                if(j==i)
                {
                    continue;
                }
                else
                    res^=a[j];
            }
            if(a[i]>res)
                cnt++;
        }
        cout<<cnt<<endl;
    }
    return 0;
}
View Code

 

posted @ 2013-12-18 09:11  whatbeg  阅读(207)  评论(0编辑  收藏  举报