1 条题解
-
0
#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
- 上传者