[CF98E]Help Shrek and Donkey

题目

传送门 to CF

题意概要
一场博弈。共 ( n + m + 1 ) (n+m+1) (n+m+1) 张扑克牌,有 n n n 张在玩家 A A A 手里,有 m m m 张在玩家 B B B 手里,还有 1 1 1 张扣在桌上。二人可以轮流进行以下操作:

  • 「交流」:询问对方是否拥有某张牌。询问的牌可以是 ( n + m + 1 ) (n+m+1) (n+m+1) 张中的任何一张1。如果对方有拥有此牌,则展示并弃置之;否则,他将回答 “无”。
  • 「猜测」:指明 ( n + m + 1 ) (n+m+1) (n+m+1) 张牌中的一张。若此牌就是扣在桌上的牌,该玩家获胜;否则失败。也就是说,不「猜测」游戏就不会结束,一「猜测」游戏就立刻结束。

现在假设二人都采用最优策略,请问先手获胜的 概率2 是多少?

思路

这是一道好题。为什么是一道好题呢?因为它既在我学过的方面让我感到自己的弱小,又在我没学过的方面让我感到自己的无知。

要抓住博弈的两个重点:已知信息,和博弈策略。信息不对称的博弈,最是恼人。

我们首先关注已知信息。我就连这个都想不到,实在惭愧……信息怎样获得?当然是通过「交流」啊。那么又分两种情况了:

  • A A A 玩家「交流」了非手牌。如果恰好是 B B B 的手牌,那么 A A A 知道了这是 B B B 的手牌;否则, A A A 玩家下一轮一定会「猜测」,因为 A A A 知道这就是答案!
  • A A A 玩家「交流」了他的手牌。 B B B 玩家如果不「猜测」,你也很可能不会去「猜测」,这会让 B B B 玩家知道这是你的手牌!——否则你的行为应该同第一条。

第二条需要稍微思考一下才能发现。虽然我连稍微思考的能力也没有。但是发现之后,综上所述,信息其实就是一方知晓另一方的某张手牌。

接下来,考虑博弈策略。第一步就把我难倒了,令人汗颜——到底什么时候才会「猜测」呢?似乎玩到中途,赌一把,直接「猜测」也可以啊?事实上,根本不会这样。下面给出证明。

假设对方手中有 y y y 张牌未知,你的手中有 x x x 张牌是对手不知道的,这时候去「猜测」,正确率是 1 y + 1 1\over y+1 y+11,也就是胜率。如果先「交流」一次,然后立马「猜测」呢?此时对手还无法知道任何信息(他问啥都没用),但是你有 1 y + 1 {1\over y+1} y+11 的概率问到桌上的牌,使得自己下一轮「猜测」的胜率是 1 1 1;亦有 y y + 1 y\over y+1 y+1y 的概率使得对手未知手牌减少,下一次「猜测」的胜率是 1 y 1\over y y1

那么对手会怎样利用这一轮呢?最可怕的操作就是「猜测」。当然,他只能选择以 p p p 的概率进行「猜测」的(即,在所有这样的情形下,他有 p p p 的占比的情况是「猜测」,因为他没有更多信息)。所以我的胜率应该是
( 1 − p ) ( 1 y + 1 ⋅ 1 + y y + 1 ⋅ 1 y ) + p ⋅ x x + 1 (1-p)\left(\frac{1}{y+1}\cdot 1+{y\over y+1}\cdot\frac{1}{y}\right)+p\cdot\frac{x}{x+1} (1p)(y+111+y+1yy1)+px+1x

对手会调整 p ∈ [ 0 , 1 ] p\in[0,1] p[0,1] 使我的胜率最小。而这是关于 p p p 的一次式,最值肯定在端点处取得,所以我的胜率实际上是
min ⁡ ( 2 y + 1 ,    x x + 1 ) \min\left(\frac{2}{y+1},\;\frac{x}{x+1}\right) min(y+12,x+1x)
不妨设 x , y ⩾ 1 x,y\geqslant 1 x,y1,那么 x x + 1 ⩾ 1 2 ⩾ 1 y + 1 \frac{x}{x+1}\geqslant\frac{1}{2}\geqslant\frac{1}{y+1} x+1x21y+11 。此时我们发现:新的胜率 min ⁡ ( 2 y + 1 ,    x x + 1 ) \min(\frac{2}{y+1},\;{x\over x+1}) min(y+12,x+1x) 高于原策略的胜率 1 y + 1 1\over y+1 y+11 。而 x y = 0 xy=0 xy=0 是什么意思呢?也就是有一方已经知道桌上的牌是什么了。所以我们得到结论:在某个玩家已经知道桌上的牌之前,不会有人「猜测」

知道了这一点之后,我们终于可以考虑一下游戏的过程。现在, A A A 玩家「交流」一张牌, B B B 玩家其实只有两种决策:立刻「猜测」 A A A 问的手牌,或者继续正常游戏。为什么这样说呢?因为对于 B B B 来说,所有未知的牌都是等价的,除了 A A A 刚刚「猜测」的牌。所以, B B B 可以选择对这张牌进行特殊考虑。

A A A 玩家,前面说过了,有两种决策。根据 我私自加上去的 规则,只有这两种可能的决策。

所以我们可以列一个表格出来,表中的数据是 A A A 的胜率。用 f ( n , m ) f(n,m) f(n,m) 表示,下一个「交流」的人手中有 n n n 张牌未曝光,而对方有 m m m 张牌未知,此时先手的胜率。

B B B \ A A A 手牌 非手牌
「猜测」此牌(非 B B B 手牌) 1 1 1 0 0 0
不「猜测」此牌(为 B B B 手牌) N / A N/A N/A 1 − f ( m − 1 , n ) 1-f(m{\rm-}1,n) 1f(m1,n)
不「猜测」此牌(非 B B B 手牌) 1 − f ( m , n − 1 ) 1-f(m,n{\rm-}1) 1f(m,n1) 1 1 1

由于问的是 “概率”,所以 A A A 可以按照某种概率选择这两种方案。 B B B 的选择也同理。假设 A A A p p p 的概率「交流」手牌, B B B q q q 的概率「猜测」此牌(如果非 B B B 手牌),那么 A A A 在「交流」非手牌时,这张牌为 B B B 的手牌的概率是不可调控的;此时 A A A 的胜率应当为
1 m + 1 [ q ⋅ 0 + ( 1 − q ) ⋅ 1 ] + m m + 1 [ 1 − f ( m − 1 , n ) ] \frac{1}{m+1}\left[q\cdot 0+(1-q)\cdot 1\right]+\frac{m}{m+1}\left[1-f(m{\rm-}1,n)\right] m+11[q0+(1q)1]+m+1m[1f(m1,n)]
反正是关于 q q q 的一次式,简记为 ( k q + c ) (kq+c) (kq+c) 。那么 A A A 的总胜率就是
p [ q ⋅ 1 + ( 1 − q ) ( 1 − f ( m , n − 1 ) ) ] + ( 1 − p ) ( k q + c ) p\left[q\cdot 1+(1-q)(1-f(m,n{\rm-}1))\right]+(1-p)(kq+c) p[q1+(1q)(1f(m,n1))]+(1p)(kq+c)
简记为 g ( p , q ) = ( α p + φ ) ( β q + γ ) + ε g(p,q)=(\alpha p+\varphi)(\beta q+\gamma)+\varepsilon g(p,q)=(αp+φ)(βq+γ)+ε 。此时 A A A 玩家希望它最大,而 B B B 玩家希望它最小。谁知道应该怎么选啊?这个题面真是让人无语……

此时回到概率的定义:多次游戏,频率的趋近值。那么,在多次游戏中,双方可以调整自己的策略!这显然不符合概率的定义了。而调整概率的结果就是,最终一定取到
min ⁡ q ∈ [ 0 , 1 ] [ max ⁡ p ∈ [ 0 , 1 ] g ( p , q ) ] \min_{q\in[0,1]}\left[\max_{p\in[0,1]}g(p,q)\right] q[0,1]min[p[0,1]maxg(p,q)]
顺便聊一聊 纳什均衡 的事儿:从另一个角度来看,答案也等于 max ⁡ p ∈ [ 0 , 1 ] [ min ⁡ q ∈ [ 0 , 1 ] g ( p , q ) ] \max_{p\in[0,1]}\left[\min_{q\in[0,1]}g(p,q)\right] maxp[0,1][minq[0,1]g(p,q)] 。但是这两者并不一定成立!只有在 鞍点3 saddle point \text{saddle point} saddle point)也就是纳什均衡点处,才能相等。原理我就完全不懂了……

所以这个函数存在鞍点吗?理论上来说,当 α p + φ = β q + γ = 0 \alpha p+\varphi=\beta q+\gamma=0 αp+φ=βq+γ=0 时,肯定是鞍点。但是取得到吗?当然, p , q ∈ { 0 , 1 } p,q\in\{0,1\} p,q{ 0,1} 时也可能是鞍点。那么落入哪个鞍点呢?
min ⁡ q ∈ [ 0 , 1 ] [ max ⁡ p ∈ [ 0 , 1 ] g ( p , q ) ] = min ⁡ q ∈ [ 0 , 1 ] [ max ⁡ g ( 0 , q ) , g ( 1 , q ) ] \min_{q\in[0,1]}\left[\max_{p\in[0,1]}g(p,q)\right] =\min_{q\in[0,1]}\big[\max g(0,q),g(1,q)\big] q[0,1]min[p[0,1]maxg(p,q)]=q[0,1]min[maxg(0,q),g(1,q)]
即,两个关于 q q q 的函数,取 max ⁡ \max max 的值要最小。据称,两条直线的斜率是一正一负,所以直接求交点即可。方程为
( α + φ ) ( β q + γ ) + ε = φ ( β q + γ ) + ε (\alpha+\varphi)(\beta q+\gamma)+\varepsilon=\varphi(\beta q+\gamma)+\varepsilon (α+φ)(βq+γ)+ε=φ(βq+γ)+ε
移项得 β q + γ = 0 \beta q+\gamma=0 βq+γ=0 。所以应该就是落入那个平凡鞍点了。感觉有道理,可是又让人觉得奇怪。

可以看到,上面的过程仍然有诸多漏洞;然而我也没有能力去弥补了。我只能走到这里。

代码

从代码中可以看出,解出来的 p ∈ [ 0 , 1 ] p\in[0,1] p[0,1],符合要求。

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cctype>
using namespace std;
# define rep(i,a,b) for(int i=(a); i<=(b); ++i)
# define drep(i,a,b) for(int i=(a); i>=(b); --i)
typedef long long llong;
inline int readint(){
    
    
	int a = 0, c = getchar(), f = 1;
	for(; !isdigit(c); c=getchar())
		if(c == '-') f = -f;
	for(; isdigit(c); c=getchar())
		a = (a<<3)+(a<<1)+(c^48);
	return a*f;
}

const int MAXN = 1005;
double dp[MAXN][MAXN];
bool vis[MAXN][MAXN];
double solve(int n,int m){
    
    
	if(!n || !m) return 1.0/(m+1); // have to guess
	if(vis[n][m]) return dp[n][m];
	/// when q = 0, the function about p
	double c0 = 1-m*solve(m-1,n)/(m+1), k0 = 1-solve(m,n-1)-c0;
	/// when q = 1, the function about p
	double c1 = c0-1.0/(m+1), k1 = 1-c1;
	double p = (c0-c1)/(k1-k0); // intersection
	return vis[n][m] = true, dp[n][m] = k0*p+c0;
}

int main(){
    
    
	int n = readint(), m = readint();
	const double ans = solve(n,m);
	printf("%.12f %.12f\n",ans,1-ans);
	return 0;
}

  1. 如果可以是任何一张,那么就可以「交流」已经被弃置的牌!这样游戏就不会终止了!所以规则应该加上一条:不得「交流」曾经被「交流」过的牌。但原题面中似乎并没有说。 ↩︎

  2. 如何理解 “概率” 呢?相当于,如果二人玩很多次该游戏,扑克每次随机发放,那么先手赢的局数与总局数的比值趋近于多少? ↩︎

  3. 鞍点,直观来说就是,沿 p p p 方向上它是 max ⁡ \max max,沿 q q q 方向上他是 min ⁡ \min min 。此时不难验证二者是相等的。 ↩︎

猜你喜欢

转载自blog.csdn.net/qq_42101694/article/details/122389711