LightOJ - 1408 Batting Practice 公式 + 概率

题目大意:有一个人在投篮,投不进的概率为p。现在他要玩一个游戏,如果连续投中m颗球或者连续投不进n颗球,那么就停止投篮
现在问,他停止投篮的期望是多少

解题思路:设g[i]为已经投中了i颗,还需要投进m-i颗球的期望,设f[i]为投丢了i颗,还需要再投丢n-i颗球的期望,那么可得公式
g[i] = (1-p) * (g[i+1] + 1) + p * (f[1] + 1),即
g[i] = (1-p) * g[i+1] + f[1] + 1
f[i]和g[i]的公式相似,这里就不写了
观察g的公式可得,最后的g[1] = (1-p)^(k-1) * (p f[1] + 1) + (1 - p) ^(k-2) (p * f[1] + 1) + … + (1-p)^0 * (f[1] + 1),即可得到一个等比数列的求和公式,f[1]也可由这个得到
现在假设q = 1 - p, k1 = q ^(m-1) + q ^ (m-2) + … + q ^ 0,k2 = p ^ (n - 1) + … + p ^ 0
那么g[1] = k1 * (p * f[1] + 1) , f[1] = k2 * (q * g[1] + 1)
由这两个公式可求得g[1]和f[1]
得到这两个后即可得到答案q * (g[1] + 1) * p (f[1] + 1)

#include<cstdio>
#include<cmath>
using namespace std;
double esp = 1e-9;

int main() {
    int test, in, out, cas = 1;
    double p;
    scanf("%d", &test);
    while(test--) {
        scanf("%lf%d%d", &p, &in, &out);
        if(p < esp) {
            printf("Case %d: %d\n", cas++, in);
            continue;
        }
        if(1.0 - p < esp) {
            printf("Case %d: %d\n", cas++, out);
            continue;
        }   
        double q = 1.0 - p;
        double k1 = 1.0 - pow(q, in - 1);
        double k2 = 1.0 - pow(p, out -1);
        k1 = k1 / p;
        k2 = k2 / q;
        double f = ((k1 * k2 * p) + k1) / (1.0 - k1 * k2 * p * q);
        double g = k2 * (q * f + 1.0);
        double ans = q * f + p * g + 1.0;
        printf("Case %d: %lf\n",cas++,ans);
    }
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值