码迷,mamicode.com
首页 > 其他好文 > 详细

[poj 3744]Scout YYF I

时间:2017-09-21 16:40:47      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:ble   技术分享   构造   printf   array   代码   emc   clu   es2017   

题目大意:

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

标签:ble   技术分享   构造   printf   array   代码   emc   clu   es2017   

原文地址:http://www.cnblogs.com/gcc314/p/7569132.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!