码迷,mamicode.com
首页 > 其他好文 > 详细

Hdu 2176 取(m堆)石子游戏

时间:2014-11-08 16:32:08      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:blog   http   io   ar   os   sp   for   div   on   

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堆)石子游戏

标签:blog   http   io   ar   os   sp   for   div   on   

原文地址:http://www.cnblogs.com/Emerald/p/4083455.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!