1 条题解

  • 0
    @ 2025-10-8 16:50:45
    #include<bits/stdc++.h>
    using namespace std;
    /*
    设f[i]表示到达i点,且i点有雷的概率 
    f[i]=p*f[i-1]+(1-p)*f[i-2] 
    这样(1-f[i])就是不踩雷的概率,ans记录乘积即ans*=(1-f[i]) 就是答案 
    但是由于,坐标数据很大,所以需要用到矩阵乘法快速幂
    矩阵如下: 
    --      --   --      --     --      --
    | p  1-p | * | f[i-1] |  =  | f[i]   |
    | 1   0  |   | f[i-2] |     | f[i-1] |
    --      --   --      --     --      --
    */
    #include<bits/stdc++.h>
    using namespace std;
    struct node
    {
        double a[2][2];
        node(){memset(a,0,sizeof a);}
    };
    node operator*(node A,node B)
    {
        node C; 
        for (int i=0;i<2;i++)
            for (int j=0;j<2;j++)
                      for (int k=0;k<2;k++)
                    C.a[i][j]=C.a[i][j]+ A.a[i][k]*B.a[k][j];
        return C;
    }
    node ksm(node A,int b)
    {
        node C;for(int i=0;i<2;i++)C.a[i][i]=1;
        for(;b;b>>=1,A=A*A)if(b&1)C=C*A; 
        return C;
    }
     
    int main()
    {
        int n,x[15];double p;
        while(scanf("%d%lf",&n,&p)!=EOF)
        {
            for(int i=0;i<n;i++) scanf("%d",&x[i]);
            sort(x,x+n);
            node f,A;
            f.a[0][0]=p,f.a[0][1]=1-p;
            f.a[1][0]=1,f.a[1][1]=0;
            double ans=1.0;
            A=ksm(f,x[0]-1);
            ans*=(1-A.a[0][0]);//由于第一个没有前面的比较特殊所以要特殊处理! 
            for(int i=1;i<n;i++)
            {
                if(x[i]==x[i-1]) continue;
                A=ksm(f,x[i]-x[i-1]-1);//x[i]-x[i-1]-1:中间没地雷的 
                ans*=(1-A.a[0][0]);
            }
            printf("%.7lf\n",ans);
        }
        return 0;
    }
    
    • 1

    信息

    ID
    499
    时间
    1000ms
    内存
    128MiB
    难度
    5
    标签
    递交数
    32
    已通过
    16
    上传者