zoukankan      html  css  js  c++  java
  • 【BZOJ】2134: 单选错位 期望DP

    【题意】有n道题,第i道题有ai个选项。把第i道题的正确答案填到第i+1道题上(n填到1),问期望做对几道题。n<=10^7。

    【算法】期望DP

    【题解】正确答案的随机分布不受某道题填到后面是否正确影响,因此每道题对的期望都是独立的。

    从排列的角度分析,对每道题有a[i-1]个选择和a[i]个选项,共a[i-1]*a[i]种排列,其中只有min(a[i-1],ai)种排列使这道题正确,所以

    $$E(i)=frac{Min(a[i-1],a[i])}{a[i-1]*a[i]}=frac{1}{Max(a[i-1],a[i])}$$

    然后根据期望的线性相加。

    复杂度O(n)。

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int maxn=10000000;
    int n,a[maxn];
    int main()
    {
        int A,B,C;
        scanf("%d%d%d%d%d",&n,&A,&B,&C,&a[1]);
        for (int i=2;i<=n;i++) a[i] = ((long long)a[i-1] * A + B) % 100000001;
        for (int i=1;i<=n;i++) a[i] = a[i] % C + 1; 
        a[0]=a[n];
        double ans=0;
        for(int i=1;i<=n;i++)ans+=1.0/max(a[i],a[i-1]);
        printf("%.3lf",ans);
        return 0;
    } 
    View Code

    如果实在纠结前面题对和后面题对有一题重合,考虑期望可以线性相加,所以实际上是可以拆出来计算的。

  • 相关阅读:
    20189222 《网络攻防技术》第一周作业
    apue.h 运行UNIX环境高编程序
    fflush()函数
    线性链表如何选择二级指针还是一级指针
    scanf()gets()fgets()区别
    淺談Coach思考模式
    Hello World
    C语言I博客作业04
    python模块:logging
    python模块:subprocess
  • 原文地址:https://www.cnblogs.com/onioncyc/p/7221612.html
Copyright © 2011-2022 走看看