zoukankan      html  css  js  c++  java
  • 抛硬币问题

    每次抛掷硬币正面向上和反面向上的概率是相同的

    问题 1 :抛掷硬币 n 次,求连续 k 次正面向上的方案数有多少种 ?

      

      一个比较好想的点子是直接 2^n 枚举,在这其中寻找符合要求的有多少种,复杂度爆表...

      在计算连续 k 次正面向上的方案数可能并不太好算,那么就转换成 用总的方案数减去仅有连续小于 k 次的方案数

      dp[i] 表示 到第 i 个位置仅存在小于连续 k 次正面向上的方案数

      1 . 当 i < k 时, dp[i] = dp[i-1]*2

      2 . 当 i == k 时, dp[i] = 2^k-1;

      3 . 当 i > k 时, dp[i] = dp[i-1]*2 - dp[i-k-1];

    代码示例 :

    #define ll long long
    const ll maxn = 1e6+5;
    const ll mod = 1e9+7;
    
    ll n, k;
    ll dp[maxn];
    
    void solve() {
        dp[0] = 1;
        ll res = 1;
        for(ll i = 1; i <= n; i++){
            if (i < k) dp[i] = dp[i-1]*2;
            else if (i == k) dp[i] = dp[i-1]*2-1;
            else dp[i] = dp[i-1]*2-dp[i-k-1];
            dp[i] %= mod;
            res *= 2; res %= mod;
        }
        ll ans = (res-dp[n]+mod)%mod;
        printf("%lld
    ", ans);
    }
    
    int main() { 
        while(~scanf("%lld%lld", &n, &k)){
            solve();
        }
        return 0;
    }
    

    问题  2 :

    如果用抛硬币来举例子,则为假设有一个硬币,抛出背面和正面的概率都是0.5,而且每次抛硬币与前次结果无关。现在做一个游戏,连续地抛这个硬币,直到连续出现三次正面为止,问平均要抛多少次才能结束游戏?注意,一旦连续抛出三次正面向上游戏就结束了,不用继续抛。

    东北日出西边雨 道是无情却有情
  • 相关阅读:
    双端队列广搜
    多源bfs
    leetcode刷题-67二进制求和
    leetcode刷题-66加一
    leetcode刷题-64最小路径和
    leetcode刷题-62不同路径2
    leetcode刷题-62不同路径
    leetcode刷题-61旋转链表
    leetcode刷题-60第k个队列
    leetcode刷题-59螺旋矩阵2
  • 原文地址:https://www.cnblogs.com/ccut-ry/p/9926421.html
Copyright © 2011-2022 走看看