题意:有n堆珠子,A和B轮流挑其中一堆拿去一些,然后可以把那堆分为两部分或者什么都不做,最后没珠子可拿的人赢。问先手赢还是输。
思路:就按普通的nim博弈做就可以了(把每一堆的数量亦或起来,最后为零Lose,否则Win)。我也不知道为什么。。。
#include<iostream>
#include<cmath>
#include<queue>
#include<vector>
#include<algorithm>
#include<string.h>
#include<cstdio>
using namespace std;
int main(){
int n;
while(cin>>n){
int ans=0;
for(int i=1;i<=n;i++){
int t;
scanf("%d",&t);
ans^=t;
}
if(ans){
cout<<"Win"<<endl;
}else{
cout<<"Lose"<<endl;
}
}
return 0;
}
本文详细介绍了 Nim 博弈的基本概念及其应用,并通过代码实例展示了如何解决此类问题。主要关注点在于如何通过计算每堆珠子数量的异或值来判断先手是否能赢。
214

被折叠的 条评论
为什么被折叠?



