前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LightOj_1408 Batting Practice

LightOj_1408 Batting Practice

作者头像
若羽
发布2019-07-15 16:36:55
3390
发布2019-07-15 16:36:55
举报
文章被收录于专栏:Code思维奇妙屋Code思维奇妙屋

题目链接

题意:

  击球训练中, 你击中一个球的概率为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)

代码:

代码语言:javascript
复制
 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 }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-08-13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档