【Codeforces 98E】 Help Shrek and Donkey
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$的概率选择去欺骗。那么最终的贡献就是
将$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的更多相关文章
- 【Codeforces 98E】 Help Shrek and Donkey 游戏策略神题
from http://www.cnblogs.com/MashiroSky/p/6576398.html A君有n张牌,B君有m张牌,桌上还有一张反扣着的牌,每张牌都不一样. 每个回合可以做两件事中 ...
- 【codeforces 415D】Mashmokh and ACM(普通dp)
[codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...
- 【codeforces 707E】Garlands
[题目链接]:http://codeforces.com/contest/707/problem/E [题意] 给你一个n*m的方阵; 里面有k个联通块; 这k个联通块,每个连通块里面都是灯; 给你q ...
- 【codeforces 707C】Pythagorean Triples
[题目链接]:http://codeforces.com/contest/707/problem/C [题意] 给你一个数字n; 问你这个数字是不是某个三角形的一条边; 如果是让你输出另外两条边的大小 ...
- 【codeforces 709D】Recover the String
[题目链接]:http://codeforces.com/problemset/problem/709/D [题意] 给你一个序列; 给出01子列和10子列和00子列以及11子列的个数; 然后让你输出 ...
- 【codeforces 709B】Checkpoints
[题目链接]:http://codeforces.com/contest/709/problem/B [题意] 让你从起点开始走过n-1个点(至少n-1个) 问你最少走多远; [题解] 肯定不多走啊; ...
- 【codeforces 709C】Letters Cyclic Shift
[题目链接]:http://codeforces.com/contest/709/problem/C [题意] 让你改变一个字符串的子集(连续的一段); ->这一段的每个字符的字母都变成之前的一 ...
- 【Codeforces 429D】 Tricky Function
[题目链接] http://codeforces.com/problemset/problem/429/D [算法] 令Si = A1 + A2 + ... + Ai(A的前缀和) 则g(i,j) = ...
- 【Codeforces 670C】 Cinema
[题目链接] http://codeforces.com/contest/670/problem/C [算法] 离散化 [代码] #include<bits/stdc++.h> using ...
随机推荐
- FSMC的个人理解
个人理解: FSMC相当于外部设备存储器地址在FSMC对应存储地址中的映射,通过在FSMC的存储地址中写数据,就能通过FSMC的地址线和数据线,将地址和数据写到外部设备存储器地址中.所以,程序中,需要 ...
- 【SDOI2017】数字表格
题面 题解 这道题目还有一种比较有意思的解法. 定义一种运算\((\mathbf f\oplus\mathbf g)(x) = \prod\limits_{d\mid x}\mathbf f(d)^{ ...
- VitualBox安装linux记录
下载镜像 CentOS 7镜像下载 阿里云站点:http://mirrors.aliyun.com/centos/7/isos/x86_64/ VirtualBox安装linux https://ww ...
- UWP简单示例(二):快速开始你的3D编程
准备 IDE:Visual Studio 开源库:GitHub.SharpDx 入门示例:SharpDX_D3D12HelloWorld 为什么选择 SharpDx? SharpDx 库与 UWP 兼 ...
- [开源 .NET 跨平台 Crawler 数据采集 爬虫框架: DotnetSpider] [三] 配置式爬虫
[DotnetSpider 系列目录] 一.初衷与架构设计 二.基本使用 三.配置式爬虫 四.JSON数据解析与配置系统 五.如何做全站采集 上一篇介绍的基本的使用方式,自由度很高,但是编写的代码相对 ...
- 使用canvas实现一个圆球的触壁反弹
HTML <canvas id="canvas" width="500" height="500" style="borde ...
- nginx的access.log文件详解
事实证明,日志文件真的是很重要很重要的.能够帮助我们快速的定位问题,并且知道用户访问的状态,浏览器,Ip,接口地址等,简直可怕.. 一.nginx的access.log(1)对博主而言,日志文件存放在 ...
- 个人博客作业_week1
1.<构建之法>的5个问题 1.如何避免在产品开发后期不断有重大修改,导致其他模块的连锁反应? 2.游戏用户有哪些类型? 3.如何衡量软件工程的质量? 4.怎么协调团队里相互间的任务分配? ...
- Beta版发布说明
我们的作品“校友聊”软件的最终版本于6月19日最终发布了,下面我们将对自己的产品进行介绍. 在使用之前,首先要进行用户注册,用户可以自行设置自己的账号,姓名,密码,签名,头像等信息,头像信息也可以在文 ...
- spring播放器详细设计说明书(一)
1 引言 1.1编写目的 编写目的是详细说明SPRING音乐播放器的设计使用,预期读者对象为在个人电脑上需要使用简单音乐播放器的用户.1.2项目背景 说明: a.待开发软件系统的名称为SPRING音 ...