// // // // // // // // // // // // // //

关于 博弈论

四种常见的博弈论

前言:

看到今天的题目突然就想看一下 应该不会写完的 先写一个 后面的慢慢学 到时候再整理

1. 巴什博弈

只有一堆 n 个物品 两个人轮流从这堆物品中取物 规定每次至少取一个 最多取 m 个 最后取光者胜

思路:

很显然的 如果 \(n = m + 1\) 那么由于一次最多只能取 \(m\) 个 所以 无论先取者取了多少 后取者都可以将剩下的一次性取完 后取者必胜
这样就有了取胜的规律 如果 \(n=(m+1)\times r+s\)\(r\)为任意自然数,\(s≤m\)) 那么先取者要拿走\(s\)个物品 如果后取者拿走\(k(≤m)\)个 那么先取者再拿走\(m+1-k\)个 结果剩下\((m+1)(r-1)\)个 以后保持这样的取法 那么先取者肯定获胜
总之,要保持给对手留下\((m+1)\)的倍数 就能最后获胜

\(P/N\) 分析:

这一类的题目有一种通用的分析方法: \(P/N\) 分析:

P点:即必败点 某玩家位于此点 只要对方无失误 则必败
N点:即必胜点 某玩家位于此点 只要自己无失误 则必胜

三个定理:

  1. 所有终结点都是必败点P
  2. 所有一步能走到必败点P的就是N点
  3. 通过一步操作只能到N点的就是P点

巴什博弈成立的条件是每一次拿的数量都是从 \(1-m\) 不间断的整数开始

例题:

取石子游戏

题目:

思路:

模板题 直接判断 \(n\) 是否可以整除 \(k + 1\) 即可 不再赘述

code:

/*
  Time: 2.2
  Worker: Blank_space
  Source: #10241. 「一本通 6.7 例 1」取石子游戏 1
*/
/*--------------------------------------------*/
#include<cstdio>
/*--------------------------------------头文件*/
const int A = 1e4 + 7;
const int B = 1e5 + 7;
const int C = 1e6 + 7;
const int D = 1e7 + 7;
const int mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const int FFF = 0x8fffffff;
/*------------------------------------常量定义*/
int n, k;
/*------------------------------------变量定义*/
inline int read() {
	int x = 0, f = 1; char ch = getchar();
	while(ch < '0' || ch > '9') {if(ch == '-') f = -1; ch = getchar();}
	while(ch >= '0' && ch <= '9') {x = (x << 3) + (x << 1) + (ch ^ 48); ch = getchar();}
	return x * f;
}
/*----------------------------------------快读*/

/*----------------------------------------函数*/
int main()
{
    n = read(); k = read();
    printf(n % (k + 1) ? "1" : "2");
	return 0;
}


To be continue...

posted @ 2021-02-02 20:47  Blank_space  阅读(110)  评论(2)    收藏  举报
// // // // // // //