博弈论
穷源溯流
路很长,尽管走便是。
展开
-
洛谷 CF388C Fox and Card Game(博弈论+思维)
如果两个人都只去靠近自己的那一半,对于先手 A,他想要前面的数时,一定会拿到,但是想要后面的数时,说明 A 所掌握的那一半的末尾数小于 B 所掌握那一半的末尾数,但是 B 可以选择最先选择 const int N=1e5+5; int n,m; int i,j,k; int a[N]; int main() { while(~sd(m)){ vector<int> ans; int have0=0,have1=0...原创 2021-03-04 20:11:59 · 184 阅读 · 1 评论 -
HDU 1847 Good Luck in CET-4 Everybody!(SG 函数)
const int N=1e3+5; int n,m; int i,j,k; int sg[N]; bool vis[N]; void getSG() { for(int i=1;i<N;i++){ ms(vis,0); for(int j=1;j<N && i-j>=0;j<<=1){ vis[sg[i-j]]=1; } ...原创 2021-03-01 15:47:07 · 166 阅读 · 0 评论 -
洛谷 P2953 [USACO09OPEN]Cow Digit Game S(sg函数)
已知 1~9 处于必胜的状态, 如果一个位置处于 P态(必败),那么他的下一个状态全为 N 态(必胜) 如果一个位置处于 N 态(必胜),那么他的下一个状态至少有一个 P 态(必败) 预处理所有的状态即可 const int N=1e6+5; int n,m; int i,j,k; int sg[N]; //bool vis[N]; void getSG() { for(int i=1;i<10;i++) sg[i]=1;...原创 2021-02-28 11:27:00 · 212 阅读 · 0 评论 -
HDU 1848 Fibonacci again and again(nim游戏+sg函数)
const int N=1e3+5; int n,m; int i,j,k; int sg[N]; bool vis[N]; const int fibo[15]={1,2,3,5,8,13,21,34,55,89,144,233,377,610,987}; void getSG() { for(int i=1;i<N;i++){ ms(vis,0); for(int j=0;j<15 && i-fibo[j]>...原创 2021-02-27 23:13:54 · 145 阅读 · 0 评论 -
HDU 1846 Brave Game(SG函数)
const int N=1e3+5; int n,m; int i,j,k; int sg[N]; bool vis[N]; void getSG() { ms(sg,0); for(int i=1;i<=n;i++){ ms(vis,0); for(int j=1;j<=m && i-j>=0;j++){ vis[sg[i-j]]=1; //将之前访问过的 sg 所代表的整数标记 } for(int j...原创 2021-02-27 23:02:06 · 165 阅读 · 0 评论 -
洛谷 P1247 取火柴游戏(nim 游戏)
简单说一下 nim游戏 的博弈原理,先将 a[i] 转化成二进制数,那么题目变成了每一次可以取走任意 a[i] 的 任意个 1 sum 是所有 a[i] 的异或值 如果 sum=0,说明有偶数个 1,先手拿 x,后手也拿 x,先手必败 如果 sum!=0,我们考虑去掉一堆,这 n-1 堆相互异或得到的结果 res,剩下的那一堆为 x,如果 x>res,那么我们考虑将拿掉 x-res,那么剩下的那一堆与其余的 n-1 堆形成异或为 0 的必败局面,可以证明一定存在 x 使得 sum!...原创 2021-02-26 22:21:01 · 402 阅读 · 0 评论 -
Educational Codeforces Round 99 (Rated for Div. 2) C. Ping-pong(博弈论)
有两个人打乒乓球,都想要赢的次数尽量多,每个人有 n ,m 点体力,每击打一次球都要消耗一点体力值,A 先发球,每个人可以接球或不接球,没有回球的人输掉这场比赛,胜者如果还有体力的话再次发球,问最后各自胜利的次数是多少 A,B 两人打球,如果都想要分数最大化的话,B 不会去接球,一直让 A 打 这题是来搞心态的吧 int i,j,k; int n,m; int a[N]; int main() { //IOS; rush(){ ...原创 2020-12-23 19:50:19 · 199 阅读 · 0 评论 -
POJ 1704 Georgia and Bob(Nim 博弈)
有 n 颗棋子,给出 n 颗棋子位于数轴上的坐标,G 先走,判断谁赢 Nim 博弈的变形,如果 n 为偶数,那么每两个棋子之间网格可以看作一堆硬币,如果 n 为奇数,则将第一个棋子与之前的网格看作第一堆硬币 const int N=1e4+5; int i,j,k; int n,m,t; int a[N]; int p[N]; int main() { //IOS; rush(){ sd(n); for...原创 2020-11-04 23:35:40 · 174 阅读 · 0 评论 -
POJ 2348 Euclid‘s Game(博弈论)
给出两个整数 a,b,每次用较小的数去减较大的数,例如 ,当 a>b 时,a=a-k*b完成运算之后 a保持大于等于 0,问当某一数字变为 0 时,另一方输 默认a>b ,a=a-k*b 有余数 res=a-k*b,因为在其中的状态实在是太多了, 特殊考虑当 a-b<b时,这一步没有任何余地,也就是 k 只能取 1,那么我们只能通过递减的方法判断谁赢 但是当 k>1 时,此时 a 可以减去多个 b,此时一定可以赢,因为当减去 k*b 会输的时候,这样只需要减...原创 2020-11-04 13:00:48 · 243 阅读 · 0 评论 -
POJ 2484 A Funny Game(博弈论)
有 n 个硬币,每次可以将 1 枚硬币翻面,或者将相邻的两个翻面,问最后谁无法翻面谁输? 只要存在 2个以上的硬币 后手赢,因为后手可以将环分成两个相等的段,然后重复先手的动作,使两边的段一直保持相等的状态,所以后手会拿到最后的硬币 int i,j,k; int n,m,t; int main() { //IOS; while(~sd(n),n){ if(n<=2) puts("Alice"); else pu...原创 2020-11-02 20:53:44 · 203 阅读 · 0 评论 -
C. Number Game(博弈)
A 和 F 比赛,有一个数 n ,有以下操作 1.减一 2.除以一个大于 1 并且必须是奇数的因数,可以除以自己,如果自己是奇数的话 规定 A 先操作,若 n 是奇数,n 除以它本身 ,A 赢 若为偶数,只要有一个因数是奇数,那么一定存在最大的奇因数,除以这个最大的,一定变为偶数,若不为 2 ,对手减一后 ,A 一定赢 //#pragma GCC optimize(2) //#include <bits/stdc++.h> #include <iostream> #...原创 2020-06-21 09:57:18 · 839 阅读 · 0 评论