7.7.1 What is the Probability

题目描述

概率一直是计算机算法中不可或缺的一部分。当确定性算法不能在短时间内解决一个问题时,就要用概率算法。在本题中,我们并不应用概率算法来解决问题。我们只是要确定某个玩家的获胜概率。 一个游戏是通过掷骰子一样的东西来玩的(并不设定它像普通骰子一样有六个面)。当一个玩家掷骰子时,如果某个预定情况发生(比如骰子显示3的一面朝上,绿色的一面朝上,等等),他就赢了。现在,有n个玩家。因此,先是第一个玩家掷骰子,然后第二个掷骰子,最后是第n个玩家掷骰子,再接下来,下一轮,先第一个玩家掷骰子,以此类推。当一个玩家掷骰子得到了预定的情况,他或她被宣布为赢家,比赛终止。请您确定其中一个玩家(第i个玩家)的获胜概率。

输入输出格式

输入格式 输入首先给出一个整数s(s≤1000),表示有多少个测试用例。接下来的s行给出s个测试用例。每行先给出一个整数n(n≤1000),表示玩家人数;然后给出一个浮点数字p,表示单次掷骰子时成功事件发生的概率(如果成功事件是骰子显示3的一面朝上,则p是单次掷骰子时显示3的一面朝上的概率)。对于普通骰子,显示3的一面朝上的的概率是1/6);最后给出一个i(i≤n),表示要确定其获胜概率的玩家的序列号(序列号从1到n)。本题设定,在输入中,没有无效的概率(p)值。

输出格式 对于每一个测试用例,在一行中输出第i个玩家获胜的概率。输出浮点数在小数点后总是有四位数字,如样例输出所示。

输入输出样例1

输入

 
  1. 2
  2. 2 0.166666 1
  3. 2 0.166666 2

输出

 
  1. 0.5455
  2. 0.4545
     #include <stdio.h>
     int main()
     {
         int T,n,id;
         double p;
         scanf("%d",&T);
         while(T--)
         {
             scanf("%d%lf%d",&n,&p,&id);
             double q=1-p;
             double tmp=q;
             for(int i=1;i<n;i++)
             {
                 tmp*=q;
             }
             double a=1;
             for(int i=1;i<id;i++)
             {
                 a*=q;
             }
             printf("%.4lf\n",p==0?0:(a*p)*1/(1-tmp));
    
         }
     }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值