首页 > 其他分享 >CF98E Help Shrek and Donkey

CF98E Help Shrek and Donkey

时间:2023-02-16 11:22:05浏览次数:56  
标签:Donkey right frac 胜率 int CF98E 先手 w21 Shrek

\(\mathcal Link\)

神仙题/纳什均衡入门题。

设 \(f(n,m)\) 表示先手有 \(n\) 张牌,后手有 \(m\) 张牌时先手获胜概率。

分析先手的策略:

  1. 直接猜
  2. 询问(指定自身没有的牌)
  3. 诈骗(指定自身已有的牌)

当 \(n=0\) 或者 \(m=0\) 时先手肯定会直接猜(\(m=0\) 必中,\(n=0\) 不猜必输)。
那在\(n,m\geq 1\) 时会不会猜一把增加胜率呢?事实上不会,下面是证明。

直接猜的胜率为 \(\frac 1{m+1}\)。

考虑如下决策:使用一次“询问”后立即猜。
“询问”有 \(\frac 1{m+1}\) 的概率得到“没有”的回答,有 \(\frac m{m+1}\) 的概率弃置一张牌。
对手唯一会对该策略从产生影响的决策是下一轮直接猜,设概率为 \(p\)。

则最终胜率为

\[\min_{p\in [0,1]} \left\{(1-p)\left(\frac{1}{m+1}+\frac {m}{m+1}\cdot \frac{1}{m}\right)+p\cdot \frac n{n+1}\right\} \]

显然为一次函数,极值在端点取到,即胜率为

\[\min\left\{\frac n{n+1},\frac 2{m+1}\right\} \]

显然在 \(n,m\geq 1\) 时不劣于直接猜。

结论:在某一方已经确定牌之前不会有猜测操作。

考虑先手的“询问”和“诈骗”,以及后手的“信任”和“不信任”。

询问 诈骗
信任 \(\dfrac m{m+1}(1-f(m-1,n))\) \(1\)
不信任 \(\dfrac{1}{m+1}+\dfrac m{m+1}(1-f(m-1,n))\) \(1-f(m,n-1)\)

这里先手和后手可能会选择随机策略,设询问/相信的概率分别为 \(p,q\)。

则终态为 \(\max\left[\min g(p,q)\right]\),由于 \(p\) 确定后是一次曲线,所以 \(q\in \{0,1\}\)。
终态为 \(\max \min [g(p,0),g(p,1)]\),由于这两条直线斜率正负相反,所以最大值在交点取到。

这也可以由“纳什均衡时每个人的混合策略使得其余参与人的任何纯策略的期望收益相等”这一结论导出。

#include <cstdio>
#include <algorithm>
#include <cctype>
using namespace std;

char buf[1<<14], *p1=buf, *p2=buf;
#define GetC() ((p1==p2)&&(p2=(p1=buf)+fread(buf,1,1<<14,stdin),p1==p2)?EOF:*p1++)

struct Ios{}io;
template <typename _tp>
Ios &operator >>(Ios &in, _tp &x){
    x=0; int w=0; char c=GetC();
    for(;!isdigit(c);w|=c=='-', c=GetC());
    for(;isdigit(c);x=x*10+(c^'0'), c=GetC());
    if(w) x=-x;
    return in;
}

const int N=1e3+5;
double f[N][N];

int main(){
    int n, m; io>>n>>m;
    for(int i=0;i<=max(n, m);++i) f[i][0]=1, f[0][i]=1.0/(i+1);
    for(int l=2;l<=2*max(n, m);++l){
        for(int i=1;i<l&&i<=max(n, m);++i){
            int j=l-i;
            if(j>max(n, m)) continue ;
            double w11=1.0*j/(j+1)*(1-f[j-1][i]), w12=1.0/(j+1)+1.0*j/(j+1)*(1-f[j-1][i]),
            w21=1, w22=1-f[j][i-1];

            //p*w11+(1-p)*w21=p*w12+(1-p)*w22
            double p=(w22-w21)/(w11-w21+w22-w12);
            f[i][j]=p*w11+(1-p)*w21;
        }
    }
    printf("%.9lf %.9lf\n",f[n][m], 1-f[n][m]);
    return 0;
}

标签:Donkey,right,frac,胜率,int,CF98E,先手,w21,Shrek
From: https://www.cnblogs.com/pref-ctrl27/p/17122286.html

相关文章