CF 98E
来源:互联网 发布:太阳能系统计算软件 编辑:程序博客网 时间:2024/06/05 23:52
题目大意
A与B做游戏,初始A有n张牌,B有m张牌,桌子上还有一张背面朝上的牌,即共n+m+1张牌,保证这n+m+1张牌上的数字各不相同且都在区间[1,n+m+1]中,A与B轮流操作,每一轮先手有两种操作:
1、直接猜桌子上面那张是什么牌,猜中就赢了,猜错就输了。
2、猜对方的一张牌,猜中之后,对方将这张牌扔掉
A先手,假设AB都绝顶聪明,双方都可以知道对方所做出过的操作,问A获胜的概率
n,m<=2000
第一眼
第一眼看题是不是有种水题的感觉:好像就是直接DP,要不直接猜桌子上的牌,要不就是直接猜对方的牌
欺骗
但很遗憾,这样的“第一眼感觉”是错误的,因为这样的博弈中存在欺骗,打个比方,设
分析
设f[n][m]表示先手有n张牌后手有m张牌时先手的获胜概率。
其实对于每一轮的先手来说,如果n,m>=1时都不会选择去猜桌子上的牌,因为此时的收益是严格劣的,所以对于n,m>=1的情况,一个先手只可能有两种操作:
1、欺骗,此时后手有两种心理:
2、指出,即猜对手有什么牌,此时如果猜中那么收益会有
我们将“相信桌子上的牌就是那张”称为“相信”,将“认为先手在欺骗”称为“不信”,那么得到一个关于收益的表格:
纳什均衡
但这样还不够,我们还没有解决出如何计算答案,由于对于先手的某一个操作,后手都有两种态度可以选择,假设先手进行“指定”的概率为p,那么先手获胜的概率一定是
这是因为后手肯定是希望先手的获胜概率尽量小的而先手的获胜概率是取决于后手的选择的,所以我们要做的就是最大化上式,可以发现min的两个元素都是直线,并且一条的斜率弱大于0,另一条的斜率弱小于0,两条直线的交点即为要求的最大值。
这就是纳什均衡的一种应用,看懂了解法的应该可以大概感受到,纳什均衡就是两个游戏者希望达到一种“均衡”,使得对方的收益尽量少自己的收益尽量大,根据这样的想法,通常情况下都会得到多种收益的情况,由于后手一定会让先手的收益变成最小的种,这就需要使得多种情况下的收益的最小值最大(就是在找“均衡点”)。
Code
#include<iostream>#include<algorithm>#include<cstdio>#include<cmath>#include<cstring>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;int get(){ char ch; int s=0; while(ch=getchar(),ch<'0'||ch>'9'); s=ch-'0'; while(ch=getchar(),ch>='0'&&ch<='9')s=s*10+ch-'0'; return s;}typedef double db;const int N = 1010;db f[N][N];int n,m;int main(){ n=get();m=get(); int v=max(n,m); fo(i,0,v)f[0][i]=1.0/(i+1); fo(i,0,v)f[i][0]=1; fo(s,2,v+v) fo(j,1,min(v,s-1)){ int i=s-j; if (i>v)continue; db k0=db(j)/(j+1)*(1-f[j-1][i]),k1=1.0/(j+1)+db(j)/(j+1)*(1-f[j-1][i]), b0=1,b1=1.0-f[j][i-1]; k0-=b0;k1-=b1; db p=(b1-b0)/(k0-k1); f[i][j]=k0*p+b0; } printf("%.16lf %.16lf\n",f[n][m],1.0-f[n][m]); return 0;}
题外话:囚徒困境
来讲讲题外话,有一个问题是这样的:
两个共谋犯罪的人被关入监狱,不能互相沟通情况。如果两个人都不揭发对方,则由于证据不确定,每个人都坐牢一年;若一人揭发,而另一人沉默,则揭发者因为立功而立即获释,沉默者因不合作而入狱五年;若互相揭发,则因证据确实,二者都判刑两年。
由于囚徒无法信任对方,因此倾向于互相揭发,而不是同守沉默。
最终导致纳什均衡仅落在非合作点上的博弈模型。
按照我自己的理解,这是因为,双方是站在“对抗”的角度而非“合作”的角度上进行这样一种游戏。
- CF 98E
- cf-e
- e-Government CF 163E
- e-Government CF 163E
- cf 163e e-Government
- CF 208E
- CF #148 DIV2 E
- CF 145E
- CF 121E
- CF 338E Optimize!
- Holes CF 13E
- cf-282e
- CF 16E Fish
- cf#ff(div2)E
- CF 260div2 E
- cf 459E DP
- CF-goodby 2014-E
- CF 91E
- hdu 3415 Max Sum of Max-K-sub-sequence(单调队列)
- mybatis中的#和$的区别
- java编程思想读书笔记 第五章 初始化与清理
- Java I/O 流
- java网络通信
- CF 98E
- hdu 1116 线段树或树状数组(基础题)
- 初识suse-Linux相关!
- 求最大子序列和 - Haskell
- Struts入门---最简单的Struts代码
- 《Effect C++》学习------条款20 :宁以pass-by-reference-to-const替换pass-by-value
- 快速幂
- JAVA对象序列化
- 2016年链家网校招笔试(JAVA研发)