首页 > 代码库 > 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堆)石子游戏
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。