题目本身不难。类似于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了很多次。

 #include <stdio.h>
#include <math.h> int main() {
int m, n;
double p, q, winp, tmp; while (scanf("%d%d%lf%lf", &n, &m, &p, &q) != EOF) {
if (n == )
printf("0.00\n");
else if (m == )
printf("1.00\n");
else if (p== || q==)
printf("0.00\n");
else if (p== || q==)
printf("1.00\n");
else if (p == q) { // k==0
winp = 1.0*n/(m+n);
printf("%.2lf\n", winp);
} else {
tmp = q*(1.0-p) / (p*(1.0-q));
winp = (1.0-pow(tmp, n)) / (1.0-pow(tmp,n+m));
printf("%.2lf\n", winp);
}
} return ;
}

最新文章

  1. Atitit prj 项目管理与行政管理(1)------项目环境的概览与建立
  2. Oracle中sequence的使用方法
  3. IoC框架(转载)
  4. php中使用end方法报错
  5. LR通过SiteScope监控mysql
  6. Win8.1设置窗口背景颜色为护眼色
  7. HTTP基础:URL格式、 HTTP请求、响应、消息
  8. 从注冊流程 分析怎样安全退出多个Activity 多种方式(附DEMO)
  9. asp.net中实现MD5加密、解密的方法
  10. 【PHP系列】PHP组件详解
  11. Yaf框架的配置
  12. STL 小白学习(9) 对组
  13. usaco-5.3.3Network of Schools 校园网
  14. Codeforces 1073 E - Segment Sum
  15. pyDay1
  16. java MongoDB查询(一)简单查询
  17. Scanline Fill Algorithm
  18. maven 根据profile,resources,filters来区分部署环境
  19. 10、springboot之集成druid
  20. 深入理解Java之数据类型

热门文章

  1. struts2中&lt;s:property&gt;的用法
  2. ###STL学习--关联容器
  3. 打包C#程序
  4. cocos2d-x实战 C++卷 学习笔记--第4章 win32平台下中文乱码问题
  5. 第十二篇、高度自适应的textView
  6. 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记1 IOS8概述
  7. 15_会话技术_Cookie
  8. VIM 同义词
  9. 《C和指针》
  10. 九度OJ 1209 最小邮票数 -- 动态规划