要在HDU上交的话,要用滚动数组优化一下空间。

    这道题想了很久,也算是想明白了,就好好写一下吧。

    P1:激活游戏失败,再次尝试。

    P2:连接失服务器败,从队首排到队尾。

    P3:激活游戏成功,队首的人出队。

    P4:服务器down掉,所有人都不能激活了。

    设d(i, j)表示i个人排队,主人公排在第j位,发生所求事件的概率。

    d(i, 1) = P1 d(i, 1) + P2 d(i, i) + P4 //分别对应激活失败,重新尝试;连接失败排到队尾;服务器down掉

    特殊地可以直接计算出 d(1, 1) = (P1 + P2) d(1, 1) + P4

    得到:

    ① j ≤ k,

    ② j > k,

    令  

    整理上面两个式子得到:

    

    

    因为是在递推,所以在计算d(i, j)的时候,d(i-1, j-1)的值已经计算出来了。

    从d(i, i)开始一直迭代到d(i, 1) (共迭代i-1次),可以计算出一个d(i, i)和d(i, 1)的关系式,不妨设计算出来的为:d(i, i) = a × d(i, 1) + b

    然后再把d(i, i)与d(i, 1)的关系代入:

    事实上这里系数a可以直接计算出为:

    这样就能计算出d(i, 1)和d(i, i),其他的就可以按照最开始的式子递推了。

 #include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std; const int maxn = + ;
int n, m, k;
double p1, p2, p3, p4;
double d[][maxn]; const double eps = 1e-; int dcmp(double x)
{
if(fabs(x) < eps) return ;
return x < ? - : ;
} int main()
{
while(scanf("%d%d%d", &n, &m, &k) == && n)
{
scanf("%lf%lf%lf%lf", &p1, &p2, &p3, &p4); if(dcmp(p3 - ) == || dcmp(p4) == ) { puts("0.00000"); continue; } memset(d, , sizeof(d));
d[][] = p4 / (1.0 - p1 - p2);
double p21 = p2 / (1.0 - p1);
double p31 = p3 / (1.0 - p1);
double p41 = p4 / (1.0 - p1); int cur = ; for(int i = ; i <= n; i++)
{
cur = - cur; double a = 1.0, b = ;
for(int j = ; j <= i; j++)
{
a *= p21;
b = b * p21 + d[-cur][j-] * p31;
if(j <= k) b += p41;
} d[cur][i] = (a * p41 + b) / (1.0 - a * p21);
d[cur][] = p21 * d[cur][i] + p41; for(int j = ; j < i; j++)
{
d[cur][j] = p21 * d[cur][j-] + p31 * d[-cur][j-];
if(j <= k) d[cur][j] += p41;
}
} printf("%.5f\n", d[cur][m]);
} return ;
}

代码君

最新文章

  1. PYTHON学习之路_PYTHON基础(6)
  2. Android:View随手指移动
  3. DataRow数组转换DataTable
  4. linux系统快速查看进程pid的方法
  5. Java DESede用C++ Openssl实现
  6. 【html】【9】div布局[div层叠]
  7. OC - 10.使用Quartz2D绘制个性头像
  8. JAVA与JSON的序列化、反序列化
  9. IT人员应该怎么跳槽
  10. cocos2d-x创建场景
  11. Swift Error fatal error: unexpectedly found nil while unwrapping an Optional value
  12. Spring实战——XML和JavaConfig的混合配置
  13. JavaWeb项目之电话本,两个版本,以及总结反思
  14. C语言数据类型和C#的区别
  15. 【转载】奇异值分解(SVD)计算过程示例
  16. GCC C语言 DLL范例,含源码
  17. Linux操作系统入门学习总结(2015.10)
  18. Swift 编程语言入门教程
  19. C语言面试题4
  20. [CENTOS7] 加入Windows域

热门文章

  1. 利用html5canvas给图片增加文字水印
  2. 2189 数字三角形W
  3. jQuery和AJAX基础
  4. iOS组件化开发&#183; 什么是组件化
  5. https握手失败案例(一)
  6. LR中订单流程脚本2
  7. sql创建作业--自动执行存储过程
  8. 洛谷 P1774 最接近神的人_NOI导刊2010提高(02)
  9. MIPS简单入门
  10. crop层