码迷,mamicode.com
首页 > 其他好文 > 详细

LightOj_1408 Batting Practice

时间:2015-08-13 13:45:41      阅读:102      评论:0      收藏:0      [点我收藏+]

标签:

题目链接

题意:

  击球训练中, 你击中一个球的概率为p,连续击中k1个球, 或者连续击空k2个球, 则训练结束。

  求结束训练所击球次数的期望。

 

思路:

  设f[x]为连续击中x个球, 距离结束训练所需要的期望

  设g[x]为连续击空x个球, 距离结束训练所需要的期望

    f[x] = p * (f[x + 1] + 1) + (1 - p) * (g[1] + 1)

    g[x] = p * (f[1] + 1) + (1 - p) * (g[x + 1] + 1)

 

  令 x = (1 - p) * (g[1] + 1)

  迭代f[x] 得到f[1]的表达式为:

                f[1] = p^(k - 2) * x + p^(k - 3) * x + ... + p ^ 0 * x。

                f[1] = x * ( (1 - p ^ (k - 1))/ (1 - p))

  一样的解法,求出g[1]的表达式,再将f[1]代进g[1] 的表达式, 解得g[1].

  再将g[1]反代入f[1]的表达式, 解得f[1]。

  最后答案为 ans = p * (f[1] + 1) + (1 - p) * (g[1] + 1)

 

代码:

技术分享
 1 #include <cmath>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <ctime>
 6 #include <set>
 7 #include <map>
 8 #include <list>
 9 #include <queue>
10 #include <string>
11 #include <vector>
12 #include <fstream>
13 #include <iterator>
14 #include <iostream>
15 #include <algorithm>
16 using namespace std;
17 #define LL long long
18 #define INF 0x3f3f3f3f
19 #define MOD 1000000007
20 #define eps 1e-6
21 #define MAXN 1000000
22 #define MAXM 100
23 #define dd cout<<"debug"<<endl
24 #define p(x) printf("%d\n", x)
25 #define pd(x) printf("%.7lf\n", x)
26 #define k(x) printf("Case %d: ", ++x)
27 #define s(x) scanf("%d", &x)
28 #define sd(x) scanf("%lf", &x)
29 #define mes(x, d) memset(x, d, sizeof(x))
30 #define do(i, x) for(i = 0; i < x; i ++)
31 #define dod(i, x, l) for(i = x; i >= l; i --)
32 #define doe(i, x) for(i = 1; i <= x; i ++)
33 double p;
34 int k1, k2;
35 double qpow(double x, int k)
36 {
37     double res = 1.0;
38     while(k)
39     {
40         if(k & 1) res *= x;
41         x *= x;
42         k >>= 1;
43     }
44     return res;
45 }
46 
47 int main()
48 {
49     int T;
50     int kcase = 0;
51     scanf("%d", &T);
52     while(T --)
53     {
54         scanf("%lf %d %d", &p, &k1, &k2);
55         if(p == 0.000)
56             printf("Case %d: %d\n", ++ kcase, k1);
57         else if(p == 1.000)
58             printf("Case %d: %d\n", ++ kcase, k2);
59         else
60         {
61             double q = 1.0 - p;
62             double x1 = 1.0 - qpow(p, k2 - 1);
63             double x2 = 1.0 - qpow(q, k1 - 1);
64             double f = x1 * x2 / q + x2 / p;
65             f = f / (1 - x1 * x2);
66             double g = q * f * x1 / q + x1 / q;
67             double ans = q * f + p * g + 1.0;
68             printf("Case %d: %.3lf\n", ++ kcase, ans);
69         }
70     }
71     return 0;
72 }
View Code

 

LightOj_1408 Batting Practice

标签:

原文地址:http://www.cnblogs.com/By-ruoyu/p/4726816.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!