博弈论
NIM游戏
https://www.cnblogs.com/dx123/p/17263056.html
P2197 【模板】Nim 游戏
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| #include<bits/stdc++.h> using namespace std; using u32 = unsigned; #define i128 __int128 using ll = long long;
using u64 = unsigned long long; const ll inf = 2147483647; const ll INF = 1e18; void solve(){ int n; cin>>n; int shu=0; for(int i=1;i<=n;i++) { int x; cin>>x; shu^=x; } if(shu)cout<<"Yes\n"; else cout<<"No\n"; }
signed main() { ios::sync_with_stdio(false); cin.tie(nullptr); int tt;cin>>tt; while(tt--){ solve(); }
return 0; }
|
P1247 取火柴游戏
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| #include<bits/stdc++.h> using namespace std; using u32 = unsigned; #define i128 __int128; using ll = long long;
using u64 = unsigned long long; const ll inf = 2147483647; const ll INF = 1e18;
signed main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin>>n; vector<int>a(n+1); int shu=0; for(int i=1;i<=n;i++){ cin>>a[i]; shu^=a[i]; } if(!shu)return cout<<"lose\n",0; for(int i=1;i<=n;i++) { if((a[i]^shu)<a[i]) { cout<<a[i]-(a[i]^shu)<<' '<<i<<'\n'; for(int j=1;j<=n;j++) { if(j!=i)cout<<a[j]<<' '; else cout<<(a[i]^shu)<<' '; } break; } }
return 0; }
|
P1288 取数游戏 II
https://www.luogu.com.cn/problem/P1288
如果向左有偶数个数或者向右有偶数个数,那么A赢,否则B赢,因为假设选择向右取的话,A每次都直接把下一个数取完,这样不管B怎么做,A总能先把0之前的那个数取完,如A先取完第一个,不管B将第二个取了多少,A直接取完第三个,第三个变成了0,所以已经无法回头了。
反之,如果都是奇数的话,无论A对第一个怎么取,对于B来说剩下的都只剩下偶数个边了,B直接按照上面的步骤暴力把下一个数取完就能赢。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| #include<bits/stdc++.h> using namespace std; using u32 = unsigned; #define i128 __int128; using ll = long long;
using u64 = unsigned long long; const ll inf = 2147483647; const ll INF = 1e18;
signed main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin>>n; vector<int>a(n+1); for(int i=1;i<=n;i++) { cin>>a[i]; } for(int i=1;i<=n;i++) { if(a[i]==0) { if(i%2==0)return cout<<"YES\n",0; break; } } for(int i=n;i>=1;i--) { if(a[i]==0) { if((n-i+1)%2==0)return cout<<"YES\n",0; break; } } cout<<"NO\n";
return 0; }
|
P4279 [SHOI2008] 小约翰的游戏
[NOIP2010 普及组] 三国游戏 题目https://www.luogu.com.cn/problem/P1199