题目链接:
http://poj.org/problem?id=3744
题意:
有个人要到一个叫“mine road”的地方,路线是一条直线,起点在1,路上有N个地雷,坐标在[1, 100000000]之间,这人每次有p(0.25≤p≤0.75)的概率向前走一步,且有1-p的概率向前走两步,问这货安全通过雷区到达"mine road"的概率
题解:
利用特征方程求出通项表达式,要走过有雷的地方f(n+1)=f(n-1)*(1-p). PS:也可以用矩阵快速幂做
代码
/*代码略丑 勿喷*/ #include<stdio.h> #include<math.h> #include<algorithm> using namespace std; const int N=15; double pow3(double a,long long b) { if(b==0)return 0; double r=1,base=a; while(b!=0) { if(b&1) r*=base; base*=base; b>>=1; } return r; } long long a[N],now; int main() { int n; double res,a1,a2,r1,r2,c1,c2,p; while(~scanf("%d%lf",&n,&p)) { r1=p/2.0-sqrt(1.0-p+p*p/4); r2=p/2.0+sqrt(1.0-p+p*p/4); for(int i=0;i<n;++i) scanf("%lld",&a[i]); sort(a,a+n); now=1,res=1.0; for(int i=0;i<n;++i) { a1=res,a2=res*p; c2=(a1*r1-a2)/(r1*r2-r2*r2); c1=(a1-c2*r2)/r1; res=(c1*pow3(r1,a[i]-now)+c2*pow3(r2,a[i]-now)); res*=(1-p); now=a[i]+1; } printf("%.7f ",res); } }