CF98E Help Shrek and Donkey
神仙题/纳什均衡入门题。
设
分析先手的策略:
- 直接猜
- 询问(指定自身没有的牌)
- 诈骗(指定自身已有的牌)
当
那在
直接猜的胜率为
考虑如下决策:使用一次“询问”后立即猜。
“询问”有
对手唯一会对该策略从产生影响的决策是下一轮直接猜,设概率为
则最终胜率为
显然为一次函数,极值在端点取到,即胜率为
显然在
结论:在某一方已经确定牌之前不会有猜测操作。
考虑先手的“询问”和“诈骗”,以及后手的“信任”和“不信任”。
询问 | 诈骗 | |
---|---|---|
信任 | ||
不信任 |
这里先手和后手可能会选择随机策略,设询问/相信的概率分别为
则终态为
终态为
这也可以由“纳什均衡时每个人的混合策略使得其余参与人的任何纯策略的期望收益相等”这一结论导出。
#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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App