【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 ...
随机推荐
- Redis日常操作命令小结
Redis缓存服务是运维工作中比较常见的一种维护工作,下面就redis日常操作命令在此做一简单小结,以备查用: 1)连接redis服务命令# redis-cli -h redis主机ip或主机域名 - ...
- Individual Reading Assignment
1.What exactly does 'agile' mean? 1)Agile software development does not means a invariable mode of p ...
- Indidual Homework Assignment
一.Pair work的得与失 合作编程在以前的学习过程中也进行过,基本也就是各人负责一部分最后再将之拼凑起来,而这次作业要求的双人合作,要求的并不是这样,而是两人应该在一起进行工作,这样的要求理想情 ...
- Linux内核总结博客 20135332武西垚
http://www.cnblogs.com/wuxiyao/p/5220677.htmlhttp://www.cnblogs.com/wuxiyao/p/5247571.htmlhttp://www ...
- Leetcode——50.Pow(x, n)
@author: ZZQ @software: PyCharm @file: leetcode50_myPow.py @time: 2018/11/22 13:58 要求:实现 pow(x, n) , ...
- 实验1--用C语言编程四则运算
#include<stdio.h>#include<stdlib.h>#include <time.h>#define N 30main(){int a,b,k,i ...
- 无符号整型 unsigned int、unsigned long、usigned long long、size_t 比较和格式控制
位数比较 由于数据的长度和平台相关,所以基于 64 位系统比较. Windows Linux unsigned int 32 bits/4294967295 32 bits unsigned long ...
- Maven的课堂笔记1
1 什么是maven? Maven是一个跨平台的项目管理工具,主要用于基于java平台的项目构建,依赖管理. Clean compile test package install run ...
- shell脚本第一课
shell脚本的文件名一般是以.sh结尾,也可以以其他格式如.txt,甚至不加后缀. 脚本的第一行的#!/bin/bash表示指定脚本执行时的解析器. #!/bin/bash #文件名:test.sh ...
- yarn工具的使用
<!-- yarn init === npm init --> <!-- yarn login === npm adduser -->登录 <!-- yarn publi ...