zoukankan      html  css  js  c++  java
  • 【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$张牌,先手的获胜概率。

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

    • 先手选择猜测对方的牌

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

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

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

    $$maxlimits_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))  ight}  ight}$$

      将$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;
    }
    
  • 相关阅读:
    第九章 引用
    第八章 指针
    第六章 面向对象
    第五章 if语句与运算符
    第四章 C++数据类型
    第三章 初步了解函数
    第二章 做一个简短的C++程序
    第一章 初始C++
    vs2012 快捷键+方法
    vue如何修改生效日期范围,以及转化成yyyy-mm-dd的格式
  • 原文地址:https://www.cnblogs.com/MashiroSky/p/6576398.html
Copyright © 2011-2022 走看看