[poj 3744]Scout YYF I
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[poj 3744]Scout YYF I相关的知识,希望对你有一定的参考价值。
题目大意:
YYF在一条有地雷的路上行走,每次有p的概率走一步,否则走两步。求安全到达终点概率。
又是概率水题,来分(luan)析(gao)一下:
题目所求为安全到达终点概率,那么肯定要分为几个部分(否则就纯粹是道司波题嘛)。
以每个地雷为分界点进行递推得出安全通过每一段的概率,相乘即可。
方程:\\({f_i} = {f_{i - 1}} \\times p + {f_{i - 2}} \\times (1 - p)\\)
我们知道直接算显然过慢,于是上一波矩阵快速幂。
列出矩阵:
\\(\\left( {\\begin{array}{*{20}{c}}
{{f_x}}\\\\
{{f_{x - 1}}}
\\end{array}} \\right) = \\left( {\\begin{array}{*{20}{c}}
p&{1 - p}\\\\
1&0
\\end{array}} \\right)\\left( {\\begin{array}{*{20}{c}}
{{f_{x - 1}}}\\\\
{{f_{x - 2}}}
\\end{array}} \\right)\\)
Well Done.
代码如下:
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <cmath> 5 using namespace std; 6 struct matrix 7 { 8 double val[2][2]; 9 matrix(){} 10 matrix(double a00,double a01,double a10,double a11) 11 { 12 val[0][0] = a00; 13 val[0][1] = a01; 14 val[1][0] = a10; 15 val[1][1] = a11; 16 } 17 matrix(const matrix &oth) {memcpy(val,oth.val,sizeof(val));} 18 inline friend matrix operator*(const matrix &a,const matrix &b) 19 { 20 return matrix( 21 a.val[0][0] * b.val[0][0] + a.val[0][1] * b.val[1][0], 22 a.val[0][0] * b.val[0][1] + a.val[0][1] * b.val[1][1], 23 a.val[1][0] * b.val[0][0] + a.val[1][1] * b.val[1][0], 24 a.val[1][0] * b.val[0][1] + a.val[1][1] * b.val[1][1] 25 ); 26 } 27 };//矩阵结构体,有构造和乘运算符。 28 inline matrix pow(matrix a,int p) 29 { 30 matrix ret(1,0,0,1); 31 while(p) 32 { 33 if(p & 1) ret = ret * a; 34 a = a * a; 35 p >>= 1; 36 } 37 return ret; 38 }//矩阵快速幂 39 int n,a[20]; 40 double p,ans; 41 int main() 42 { 43 while(~scanf("%d%lf",&n,&p)) 44 { 45 matrix transmtx(p,1 - p,1,0);ans = 1; 46 for(int i = 0;i < n;i++)scanf("%d",&a[i]); 47 sort(a,a + n); 48 for(int i = 0;i < n;i++) 49 { 50 if(i != 0 && a[i] == a[i - 1]) continue; 51 matrix res = pow(transmtx,i == 0 ? a[i] - 1 : a[i] - a[i - 1] - 1);//快速幂搞递推了 52 ans *= (1 - res.val[0][0]);//累积概率 53 } 54 printf("%.7f\\n",ans); 55 } 56 return 0; 57 }
话说输出我之前用了lf,调了2小时,淦。
以上是关于[poj 3744]Scout YYF I的主要内容,如果未能解决你的问题,请参考以下文章