【POJ】2234 - Matches Game(尼姆博弈 / Nim游戏)
原题链接:http://poj.org/problem?id=2234
思路: 尼姆博弈的裸题。
- 如果 n = 1,那么先取的玩家将这堆火柴全取完获得胜利,输出 “Yes”
- 如果 n = 2,每堆的数量分别为 n1,n2
①:n1 = n2 ,第一个玩家取一部分火柴,第二个玩家在另一堆通过取与第一个玩家相等数量的火柴获得胜利,输出“No”
②:n1 ≠ n2 ,第一个玩家先把两堆多出来的火柴取走,再取与第二个玩家相等数量的火柴获得胜利,输出“Yes” - 如果 n > 2,先手能够在非平衡状态下取胜,后手能够在平衡状态下取胜。
结论:n 堆石子异或和不为 0 ,先手必胜,否则先手必输。
Code:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long ll;
int main(){
int n;
while(cin>>n){
int ans=0,x;
for(int i=1;i<=n;i++){
cin>>x;
ans^=x;
}
if(ans) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}
还没有评论,来说两句吧...