http://codeforces.com/problemset/problem/98/E (题目链接)

题意

  A君有n张牌,B君有m张牌,桌上还有一张反扣着的牌,每张牌都不一样。

  每个回合可以做两件事中的一件

  • 猜测桌上的牌是什么,猜对则胜,猜败则输。
  • 询问对方是否有某张牌,若有则需要将其示出,否则继续游戏。

  A和B都很聪明,问A的胜率。

Solution

  碉堡了!!转自:http://blog.csdn.net/Yves___/article/details/51814024

  首先不到最后一刻是不会选择猜桌上的牌的。

  假如某一次对方问了一张自己手上没有的牌,就可能会怀疑桌上的牌就是这张。

  而询问对方是否有某张牌,我们可以选择询问自己手上有的牌,假如对方相信而去猜测这张牌的话就会输掉,我们称这样的行为作欺骗。

  记$f(n,m)$表示先手有$n$张牌,后手有$m$张牌,先手的获胜概率。

  那么就可以列一个表格,表示先手的选择以及后手的应对。

  • 先手选择猜测对方的牌

    • 后手认为先手在猜测,先手获胜的概率是$\displaystyle\frac{m}{m+1}(1-f(m-1,n))$
    • 后手认为先手在欺骗,先手获胜的概率是$\displaystyle\frac{1}{ m+1 } + \frac{m}{m+1}(1-f(m-1,n))$
  • 先手选择欺骗

    • 后手认为先手在猜测,先手获胜的概率是$\displaystyle 1$
    • 后手认为先手在欺骗,先手获胜的概率是$\displaystyle 1-f(m,n-1)$

  那么对于先手的任意一个策略,后手会选择最优的策略去使他赢的概率尽可能小。也就是说假如先手用$p$的概率选择去猜测,$1−p$的概率选择去欺骗。那么最终的贡献就是

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

  将$p$视为自变量,问题就转化为两条直线取$min$的问题,求个交点就可以得到最大值。

细节

  直线的交点别求错了。。

代码

// codeforces 98E
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std; double g[1010][1010]; double f(int n,int m) {
if (!n) return 1.0/(m+1);
if (!m) return 1.0;
if (g[n][m]) return g[n][m];
double A=(1-f(m-1,n))*m/(m+1);
double B=(1-f(m-1,n))*m/(m+1)+1.0/(m+1);
double C=1.0;
double D=1-f(m,n-1);
double p=(D-C)/((A-C)-(B-D));
return g[n][m]=p*A+(1-p)*C;
}
int main() {
int n,m;
scanf("%d%d",&n,&m);
printf("%.10lf %.10lf",f(n,m),1-f(n,m));
return 0;
}

【Codeforces 98E】 Help Shrek and Donkey的更多相关文章

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

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

  2. 【codeforces 415D】Mashmokh and ACM(普通dp)

    [codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...

  3. 【codeforces 707E】Garlands

    [题目链接]:http://codeforces.com/contest/707/problem/E [题意] 给你一个n*m的方阵; 里面有k个联通块; 这k个联通块,每个连通块里面都是灯; 给你q ...

  4. 【codeforces 707C】Pythagorean Triples

    [题目链接]:http://codeforces.com/contest/707/problem/C [题意] 给你一个数字n; 问你这个数字是不是某个三角形的一条边; 如果是让你输出另外两条边的大小 ...

  5. 【codeforces 709D】Recover the String

    [题目链接]:http://codeforces.com/problemset/problem/709/D [题意] 给你一个序列; 给出01子列和10子列和00子列以及11子列的个数; 然后让你输出 ...

  6. 【codeforces 709B】Checkpoints

    [题目链接]:http://codeforces.com/contest/709/problem/B [题意] 让你从起点开始走过n-1个点(至少n-1个) 问你最少走多远; [题解] 肯定不多走啊; ...

  7. 【codeforces 709C】Letters Cyclic Shift

    [题目链接]:http://codeforces.com/contest/709/problem/C [题意] 让你改变一个字符串的子集(连续的一段); ->这一段的每个字符的字母都变成之前的一 ...

  8. 【Codeforces 429D】 Tricky Function

    [题目链接] http://codeforces.com/problemset/problem/429/D [算法] 令Si = A1 + A2 + ... + Ai(A的前缀和) 则g(i,j) = ...

  9. 【Codeforces 670C】 Cinema

    [题目链接] http://codeforces.com/contest/670/problem/C [算法] 离散化 [代码] #include<bits/stdc++.h> using ...

随机推荐

  1. [Deep-Learning-with-Python]GAN图片生成

    GAN 由Goodfellow等人于2014年引入的生成对抗网络(GAN)是用于学习图像潜在空间的VAE的替代方案.它们通过强制生成的图像在统计上几乎与真实图像几乎无法区分,从而能够生成相当逼真的合成 ...

  2. Scala学习(六)练习

    Scala中的对象&练习 1. 编写一个Conversions对象,加入inchesToCentimeters,gallonsToLiters和milesToKilometers方法 程序代码 ...

  3. js类型----你所不知道的JavaScript系列(5)

    ECMAScirpt 变量有两种不同的数据类型:基本类型,引用类型.也有其他的叫法,比如原始类型和对象类型等. 1.内置类型 JavaScript 有七种内置类型: • 空值(null) • 未定义( ...

  4. Python基础系列讲解——random模块随机数的生成

    随机数参与的应用场景大家一定不会陌生,比如密码加盐时会在原密码上关联一串随机数,蒙特卡洛算法会通过随机数采样等等.Python内置的random模块提供了生成随机数的方法,使用这些方法时需要导入ran ...

  5. Zookeeper 源码学习(一)环境搭建

    前言 最近准备学习 Zookeeper,想从 Zookeeper 开始逐步深入了解各类中间件,学习分布式计算. 下载源码 执行指令,下载代码: git clone https://github.com ...

  6. maven依赖的描述

    maven的坐标和依赖 坐标和依赖,主要涉及的就是pom文件的头部和<dependencies>标签部分(1)pom文件的头部 这里头部不是指pom文件的开头<project> ...

  7. redis的优缺点

    优点: 1 读写性能优异 2 支持数据持久化,支持AOF和RDB两种持久化方式 3 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离. 4 数据结构丰富:除了支持string类型的value ...

  8. Essential Netty in Action 《Netty 实战(精髓)》读书笔记一

    NIO 最初是为 New Input/Output 的缩写.然而,Java 的 API 已经存在足够长的时间,它不再是新的.现在普遍使用的缩写来表示Nonblocking I/O (非阻塞 I/O). ...

  9. WIN10快捷键

    WIN10快捷键 多桌面切换:WIN + CTRL +  ←/→ 桌面横竖屏转向:ALT + CTRL +  ←/→

  10. js中如何优雅的写if判断

    我们编写js代码时经常遇到复杂逻辑判断的情况,通常大家可以用if/else或者switch来实现多个条件判断,但这样会有个问题,随着逻辑复杂度的增加,代码中的if/else/switch会变得越来越臃 ...