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

 

你可能感兴趣的:(spring)