zoukankan      html  css  js  c++  java
  • 【HDOJ】1204 糖果大战

    题目本身不难。类似于dp。f(i)表示手中现有i颗糖果赢的概率,则下一局赢的概率是p(1-q),下一局输的概率是q(1-p),下一句平手的概率是1-p(1-q)-q(1-p),平手包括两人均答对或答错。那么可推导状态转移方程:
    f(i) = p(1-q)f(i-1) + q(1-p)f(i+1) + [ 1-p(1-q)-q(1-p) ]f(i)
    归并相同项可以得到等比数列,p(1-q)(f(i) - f(i-1)) = q(1-p)(f(i+1) - f(i))。设定比例系数,并利用等比数列求和公式可求。其中需要注意的是,f(0)=0,f(n+m)=1,因为手中若已经有n+m颗糖果,则已经获得全部胜利。我们需要求的是f(n)的概率是多少。除了考虑n或m为0的情况,还有p或q为1/0的情况,还必须考虑等比系数为1的情况,当等比系数为1无法用等比求和公式时,则证明二者答对的概率相等,此时应当考虑两者的糖果数目(概率论等概率)。等比为1,很容易想不到,wa了很多次。

     1 #include <stdio.h>
     2 #include <math.h>
     3 
     4 int main() {
     5     int m, n;
     6     double p, q, winp, tmp;
     7 
     8     while (scanf("%d%d%lf%lf", &n, &m, &p, &q) != EOF) {
     9         if (n == 0)
    10             printf("0.00
    ");
    11         else if (m == 0)
    12             printf("1.00
    ");
    13         else if (p==0 || q==1)
    14             printf("0.00
    ");
    15         else if (p==1 || q==0)
    16             printf("1.00
    ");
    17         else if (p == q) {  // k==0
    18             winp = 1.0*n/(m+n);
    19             printf("%.2lf
    ", winp);
    20         } else {
    21             tmp = q*(1.0-p) / (p*(1.0-q));
    22             winp = (1.0-pow(tmp, n)) / (1.0-pow(tmp,n+m));
    23             printf("%.2lf
    ", winp);
    24         }
    25     }
    26 
    27     return 0;
    28 }
    View Code




  • 相关阅读:
    URLOS用户福利:申请免费的泛域名(通配符域名)SSL证书
    主机管理面板LuManager以Apache2协议开源发布,可用作商业用途
    微服务设计概览
    使用SpringBoot搭建Web项目
    公共方法整合(四)数组相关
    阿里云短信整合封装类库
    高德地图接口使用整理
    公共方法整合(三)时间相关方法
    PHP 服务端友盟推送
    html 录音并上传
  • 原文地址:https://www.cnblogs.com/bombe1013/p/3604099.html
Copyright © 2011-2022 走看看