博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【HDOJ】1204 糖果大战
阅读量:7101 次
发布时间:2019-06-28

本文共 1252 字,大约阅读时间需要 4 分钟。

题目本身不难。类似于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 
2 #include
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\n");11 else if (m == 0)12 printf("1.00\n");13 else if (p==0 || q==1)14 printf("0.00\n");15 else if (p==1 || q==0)16 printf("1.00\n");17 else if (p == q) { // k==018 winp = 1.0*n/(m+n);19 printf("%.2lf\n", 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\n", winp);24 }25 }26 27 return 0;28 }
View Code

 

转载于:https://www.cnblogs.com/bombe1013/p/3604099.html

你可能感兴趣的文章
如何更深入地学习Linux?
查看>>
目标检測的图像特征提取之(一)HOG特征
查看>>
MySQL-EXPLAIN用法详解
查看>>
du 命令
查看>>
jdbctemplate中的query(sql,params,mapper)与queryForList(sql,params,class)区别
查看>>
C++ 虚函数表解析
查看>>
Responder一点也不神秘————iOS用户响应者链完全剖析
查看>>
Type mismatch: cannot convert from java.sql.PreparedStatement to com.mysql.jdbc.PreparedStatement
查看>>
SharePoint 2013 工作流平台的选项不可用
查看>>
thinkphp 重定向redirect
查看>>
Builder创建者模式
查看>>
安卓应用使用QQ登录的申请流程
查看>>
Android批量图片加载经典系列——采用二级缓存、异步加载网络图片
查看>>
redis 数据类型详解 以及 redis适用场景场合
查看>>
RAC安装重新运行root.sh
查看>>
Mac下面的SecureCRT(附破解方案) 更新到最新的7.3.2(转)
查看>>
H5版俄罗斯方块(5)---需求演进和产品迭代
查看>>
Java多线程有哪几种实现方式? Java中的类如何保证线程安全? 请说明ThreadLocal的用法和适用场景...
查看>>
工作队列(workqueue) create_workqueue/schedule_work/queue_work
查看>>
size_t、ptrdiff_t【转】
查看>>