B - Bobby‘s Bet(期望+组合数)

题目:https://vjudge.net/contest/425090#problem/B

题意:摇色子游戏,色子有s面,每一面的数分别是1-s,在y回合里面是否至少有x回合摇出来的数大于等于r,如果是的话,那我赢w块钱,否则输一块钱,问:我是否能赢钱,能的话出去yes,否则输出no。

题解:算出我总共赢的概率,然后乘以w,这是期望,然后看一下是否比1大就行。
算总共赢的概率:首先y回合总共有pow(s,y)中方案,那么算出我能赢的方案数,比一下就行。
算我赢的方案数:首先枚举我从赢x-y局,然后C(y,x)是我赢在y回合中赢x回合的方案数,然后再乘以我每一回合赢的时候有几种赢法就行了。

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+7;
const ll inf=(1ll<<32)-1;
const ll mod=1e9+7;
ll ma[12][12];
void get_zuhe()  //求组合数
{
    ma[0][0]=1;
    for(int i=1; i<=11; i++)
    {
        ma[i][0]=ma[i][i]=1;
        for(int j=1; j<i; j++)
            ma[i][j]=ma[i-1][j]+ma[i-1][j-1];
    }
}

ll qpow(ll a,ll k)//快速幂
{
    ll ans=1;
    while(k)
    {
        if(k&1)ans=(ll)ans*a;
        a=(ll)a*a;
        k=k/2;
    }
    return ans;
}
int main()
{
    get_zuhe();
    int T;
    scanf("%d",&T);
    while(T--)
    {
        ll r,s,x,y,w;
        scanf("%lld%lld%lld%lld%lld",&r,&s,&x,&y,&w);
        int a=s-r+1;  //我有几种赢法
        int b=r-1;
        ll down=qpow(s,y);
        double p=0;
        for(int i=x; i<=y; i++)
        {   //ma是y回合里赢i回合的方案书,俩qpow是我每一回合里面
        //赢的方法的数量
            p+=1.0*ma[y][i]*qpow(a,i)*qpow(b,y-i)/down;
        }
        p=1.0*p*w;   //看是否比1大
        if(p>1)puts("yes");
        else puts("no");
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值