首页 > 代码库 > Hdu 2176 取(m堆)石子游戏

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\n");            for( it=stone.begin();it!=stone.end();it++ )            {                oneXor = allXor ^ *it;                /*for( i=0;i<*it;i++ )                {                    if( (oneXor^i) == 0 )                    {                        printf("%d %d\n", *it,i);                        break;                    }                }*/   // time limit exceeded                if( oneXor < *it )                {                    printf("%d %d\n", *it, oneXor);                }            }        }        else        {            printf("No\n");        }    }    return 0;}

 

Hdu 2176 取(m堆)石子游戏