AcWing 891. Nim游戏
1.题意:
2.题解:
a[1]a[2]a[3]…a[n]=0先手必败
a[1]a[2]a[3]…a[n]!=0先手必胜
3.ac代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
int n;
ll a[N];
int main(){
cin>>n;
ll res=0;
for(int i=1;i<=n;i++){
cin>>a[i];
res^=a[i];
}
if(res==0)
cout<<"No"<<endl;
else
cout<<"Yes"<<endl;
}
AcWing 892. 台阶-Nim游戏
1.题意:
2.题解:
a[1]^a[3] ^ a[5]…a[n]==0先手必败
a[1]^a[3] ^ a[5]…a[n]!=0先手必胜
3.ac代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
int n;
ll a[N];
ll res;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
if(i&1){
res^=a[i];
}
}
if(!res){
cout<<"No"<<endl;
}else{
cout<<"Yes"<<endl;
}
}
AcWing 893. 集合-Nim游戏
1.题意:
2.题解:
sg函数,可反复看
3.ac代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e4+10;
int n;
int k;
int a[N];
int f[N];
int sg(int x){
if(f[x]!=-1) return f[x];
unordered_set<int> s;
for(int i=1;i<=n;i++){
int sum=a[i];
if(x>=sum) s.insert(sg(x-sum));
}
for(int i=0;;i++){
if(!s.count(i))
return f[x]=i;
}
}
int main(){
memset(f,-1,sizeof f);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
cin>>k;
int res=0;
for(int i=1;i<=k;i++){
int x;
cin>>x;
res^=sg(x);
}
if(res){
cout<<"Yes"<<endl;
}else{
cout<<"No"<<endl;
}
}
AcWing 894. 拆分-Nim游戏
1.题意:
2.题解:
3.ac代码:
在这里插入代码片