标签: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; }
标签:blog http io ar os sp for div on
原文地址:http://www.cnblogs.com/Emerald/p/4083455.html