Hdu 2176 取(m堆)石子游戏

Problem地址:http://acm.hdu.edu.cn/showproblem.php?pid=2176

取石子游戏,以前都是问能否胜,这次问更实际的问题--如何取胜。

思路很简单:取走一定量的石子,使其变为必败态。先算出总的状态,就是所有石子数异或后的值,取一个变量名叫allXor。

然后将allXor与其中一堆石子异或,得出的值假设叫oneXor,则得出的值为除这堆石子外的其他所有堆的石子的数量的异或值。

然后很容易想到如果这堆石子剩下的数量为oneXor,那么所有石子堆的数量异或得出的值为0,也就是必败态。

#include <iostream>
#include <vector>
#include <cstdio>

using namespace std;

int main()
{
    vector <int> stone;
    vector <int> :: iterator it;
    int n;
    int i;
    int allXor,oneXor;
    int in;
    while( scanf("%d",&n)!=EOF && n )
    {
        stone.clear();
        allXor = 0;   // initial
        for( i=0;i<n;i++ )
        {
            scanf("%d", &in);
            stone.push_back(in);
            allXor ^= in;
        }

        if( allXor )   // judge
        {
            printf("Yes
");
            for( it=stone.begin();it!=stone.end();it++ )
            {
                oneXor = allXor ^ *it;
                /*for( i=0;i<*it;i++ )
                {
                    if( (oneXor^i) == 0 )
                    {
                        printf("%d %d
", *it,i);
                        break;
                    }
                }*/   // time limit exceeded
                if( oneXor < *it )
                {
                    printf("%d %d
", *it, oneXor);
                }
            }
        }
        else
        {
            printf("No
");
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Emerald/p/4083455.html