题意:A和B两个卡牌大师玩游戏,A有$n$张牌,B有$m$张牌,桌上有$1$张牌,这$n+m+1$张牌互不相同且A和B都知道这些牌里有什么牌(但他们互相不知道对方有什么牌,两个人也都不知道桌上的那张牌是哪张),游戏轮流进行,A先手,每轮可以①询问对方有没有某张牌,如果对方有,就要把它丢弃,否则表明自己没有这张牌②猜测桌上的牌,猜对了就赢,猜错了就输,问$A$和$B$获胜的概率(假设两人都磕了药足够聪明)

很棒的题啊!奇妙思路++

首先肯定只有在最后才会去猜测桌上的牌,因为要一发定输赢

假设这轮是A,下一轮是B,那么A可以去询问B有没有某张牌,这个询问有两种性质,可以是

①真询问,也就是随机询问对方有没有$m+1$张牌中的某一张

②假询问,也就是随机询问对方有没有自己$n$张牌中的某张牌

为什么要有假询问?因为这样做可以勾引B去猜桌上的牌,如果B猜错了,A自然就赢了

下面对A的询问真假性和B的反应分类讨论,设先手有$n$张牌,后手有$m$张牌时先手获胜的概率是$f\left(n,m\right)$

①A做真询问

如果问到B有的牌,那么B就知道A是在做真询问,局面就变成B扔掉一张牌并先手;此时A获胜的概率是$\dfrac{m}{m+1}\left(1-f\left(m-1,n\right)\right)$

如果恰好问到桌上那张牌:如果B认为A在做真询问,那么B就赢了;如果B认为A在做假询问,那么B之后就会认为桌上的牌不是这张,A就知道桌上的牌是这张,那么A就赢了,此时A获胜的概率应加上$\dfrac{1}{m+1}$

②A做假询问

如果B认为A是在做真询问,那么他就会猜错,A稳赢,获胜概率为$1$

如果B认为A是在做假询问,那么A和B都知道A有这张牌,和扔掉没有区别,所以局面相当于A扔掉一张牌后B先手,此时A获胜的概率为$1-f\left(m,n-1\right)$

假设A有$p$的概率选择真询问,有$1-p$的概率选择假询问,因为B会让A获胜的概率尽可能小,所以A的总获胜概率为

$\min\left\{\dfrac{pm}{m+1}\left(1-f\left(m-1,n\right)\right)+1-p,p\left(\dfrac{1}{m+1}+\dfrac{m}{m+1}\left(1-f\left(m-1,n\right)\right)\right)+\left(1-p\right)\left(1-f\left(m,n-1\right)\right)\right\}$

A要找到一个$p$使上面这个式子最大,如果把$p$作为自变量这其实就是两个一次函数取$\min$,一个单调递增一个单调递减,所以直接取交点即可

最后发现这其实是个DP,因为转移时下标比较鬼畜所以写成递归的形式会比较好

真是妙啊!

#include<stdio.h>
double p[1010][1010];
double du(int x){return x;}
void f(int n,int m){
	if(p[n][m]>0)return;
	if(n==0){
		p[0][m]=1/du(m+1);
		return;
	}
	if(m==0){
		p[n][0]=1;
		return;
	}
	f(m-1,n);
	f(m,n-1);
	double pr=p[m][n-1]/(p[m][n-1]+1/du(m+1));
	p[n][m]=pr*m/du(m+1)*(1-p[m-1][n])+1.-pr;
}
int main(){
	int n,m;
	scanf("%d%d",&n,&m);
	f(n,m);
	printf("%.9lf %.9lf",p[n][m],1.-p[n][m]);
}

[CF98E]Help Shrek and Donkey的更多相关文章

  1. [CF98E]Help Shrek and Donkey(纳什均衡)

    https://www.cnblogs.com/MashiroSky/p/6576398.html #include<cstdio> #include<algorithm> # ...

  2. 【Codeforces 98E】 Help Shrek and Donkey

    http://codeforces.com/problemset/problem/98/E (题目链接) 题意 A君有n张牌,B君有m张牌,桌上还有一张反扣着的牌,每张牌都不一样. 每个回合可以做两件 ...

  3. 【Codeforces 98E】 Help Shrek and Donkey 游戏策略神题

    from http://www.cnblogs.com/MashiroSky/p/6576398.html A君有n张牌,B君有m张牌,桌上还有一张反扣着的牌,每张牌都不一样. 每个回合可以做两件事中 ...

  4. hdu 4740 The Donkey of Gui Zhou bfs

    The Donkey of Gui Zhou Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproble ...

  5. The Donkey of Gui Zhou

    Problem Description There was no donkey in the province of Gui Zhou, China. A trouble maker shipped ...

  6. hdu 4740 The Donkey of Gui Zhou(dfs模拟好题)

    Problem Description There was no donkey ,) , the down-right cell ,N-) and the cell below the up-left ...

  7. hdu 4740 The Donkey of Gui Zhou

    1.扯犊子超多if else 判断的代码,华丽丽的TLE. #include<stdio.h> #include<string.h> #define N 1010 int ma ...

  8. hdu 4740 The Donkey of Gui Zhou(暴力搜索)

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4740 [题意]: 森林里有一只驴和一只老虎,驴和老虎互相从来都没有见过,各自自己走过的地方不能走第二次 ...

  9. HDU 4740 The Donkey of Gui Zhou (模拟)

    由于一开始考虑的很不周到,找到很多bug.....越改越长,不忍直视. 不是写模拟的料...................... 反正撞墙或者碰到已经走过的点就会转向,转向后还碰到这两种情况就会傻站 ...

随机推荐

  1. 从零开始学习MXnet(二)之dataiter

    MXnet的设计结构是C++做后端运算,python.R等做前端来使用,这样既兼顾了效率,又让使用者方便了很多,完整的使用MXnet训练自己的数据集需要了解几个方面.今天我们先谈一谈Data iter ...

  2. wget、yum、rpm、apt-get区别

    wget 类似于迅雷,是一种下载工具, 通过HTTP.HTTPS.FTP三个最常见的TCP/IP协议下载,并可以使用HTTP代理 名字是World Wide Web”与“get”的结合. yum: 是 ...

  3. 封装常用的Javascript跨浏览器方法

    var EventUntil={ // 跨浏览器的添加事件方法 addHandler:function(element,type,handler){ if(element.addEventListen ...

  4. java封装的使用

    一:前言 其实以前我们来学习java特性的时候,对于封装好想觉得没什么用处,至少我那个时候的感觉(不知道是不是我学的太浅薄了~),现在由于项目从零开始做得,在做得过程中我感觉到原来封装是这样用的. 二 ...

  5. Drupal7所见即所得模块CKEditor

    初学Drupal(7.26),刚好遇到一个需要用到CKEditor模块的项目,于是就摸索着把它给装上了. 图片上传出问题 回到Drupal7的管理页面后刚好发现了对于CKEditor的“状态报告”(错 ...

  6. 汕头市队赛 SRM 06 B 起伏的排名

    B 起伏的排名 SRM 06 背景&&描述 天才麻将少女KPM立志要在日麻界闯出一番名堂.     在上个星期她打了n场麻将,每场麻将都有n名玩家.KPM自然记得自己的n次排名.   ...

  7. openstack中region、az、host aggregate、cell 概念

    1. region 更像是一个地理上的概念,每个region有自己独立的endpoint,regions之间完全隔离,但是多个regions之间共享同一个keystone和dashboard.(注:目 ...

  8. python脚本运行的几种方式

    1.脚本式编程 将如下代码拷贝至 hello.py文件中: print ("Hello, Python!"); 通过以下命令执行该脚本: $ python ./hello.py h ...

  9. python 实现定时循环触发某个方法

    直接贴上代码 import threading def sayhello(): print "hello world" global t #Notice: use global v ...

  10. 培训补坑(day8:树上倍增+树链剖分)

    补坑补坑.. 其实挺不理解孙爷为什么把这两个东西放在一起讲..当时我学这一块数据结构都学了一周左右吧(超虚的) 也许孙爷以为我们是省队集训班... 好吧,虽然如此,我还是会认真写博客(保证初学者不会出 ...