博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Scout YYF I (概率+矩阵快速幂)
阅读量:6149 次
发布时间:2019-06-21

本文共 2954 字,大约阅读时间需要 9 分钟。

YYF is a couragous scout. Now he is on a dangerous mission which is to penetrate into the enemy's base. After overcoming a series difficulties, YYF is now at the start of enemy's famous "mine road". This is a very long road, on which there are numbers of mines. At first, YYF is at step one. For each step after that, YYF will walk one step with a probability of p, or jump two step with a probality of 1- p. Here is the task, given the place of each mine, please calculate the probality that YYF can go through the "mine road" safely.

Input

The input contains many test cases ended with EOF
Each test case contains two lines. 
The First line of each test case is N (1 ≤ N ≤ 10) and p (0.25 ≤ p ≤ 0.75) seperated by a single blank, standing for the number of mines and the probability to walk one step. 
The Second line of each test case is N integer standing for the place of N mines. Each integer is in the range of [1, 100000000].

Output

For each test case, output the probabilty in a single line with the precision to 7 digits after the decimal point.

Sample Input

1 0.522 0.52 4

Sample Output

0.50000000.2500000 题意:一条长路有 N (1 ≤ N ≤ 10)颗地雷,一个人走一步的概率是 p ,走两步的概率是 (1-p) ,然后给出 N 颗地雷的位置 ,问这个人安全走过所有地雷的概率是多少 题解:对于一个位置x,设能走到的概率是 P(x) ,那么 P(x) = P(x-1)*p + P(x-2)*(1-p) 这个数x可能很大,所以需要矩阵快速幂 然后将整个的路看成由地雷分割的 N 段路 [0 -- x1] [x1+1 -- x2] [x2+1 -- x3] ... ... 所以,他能安全过去的概率就是 N 段都能过去的连乘
1 #include 
2 #include
3 #include
4 using namespace std; 5 #define MAXN 12 6 7 int n; 8 double p; 9 int bomb[MAXN];10 11 double base[2][2];12 double res[2][2];13 14 //[ p(x) ] = [ p , 1-p ]^(x-1) * [ 1 ]15 //[ p(x-1) ] [ 1 , 0 ] [ 0 ]16 void quick_mi(int x)17 {18 double tp[2][2];19 while (x)20 {21 if (x%2==1)22 {23 for (int i=0;i<2;i++)24 for (int j=0;j<2;j++)25 {26 tp[i][j]=0;27 for (int k=0;k<2;k++)28 tp[i][j]+=res[i][k]*base[k][j];29 }30 for (int i=0;i<2;i++)31 for (int j=0;j<2;j++)32 res[i][j]=tp[i][j];33 }34 for (int i=0;i<2;i++)35 for (int j=0;j<2;j++)36 {37 tp[i][j]=0;38 for (int k=0;k<2;k++)39 tp[i][j]+=base[i][k]*base[k][j];40 }41 for (int i=0;i<2;i++)42 for (int j=0;j<2;j++)43 base[i][j]=tp[i][j];44 x/=2;45 }46 }47 48 double Mi(int x)//处于位置1踩到位置 x 的概率49 {50 if (x==0) return 0;51 base[0][0]=p,base[0][1]=1.0-p;52 base[1][0]=1,base[1][1]=0;53 res[0][0]=1;res[0][1]=0;54 res[1][0]=0;res[1][1]=1;55 quick_mi(x-1);56 return res[0][0];57 }58 59 int main()60 {61 while (scanf("%d%lf",&n,&p)!=EOF)62 {63 for (int i=0;i
View Code

 

 

转载于:https://www.cnblogs.com/haoabcd2010/p/6700730.html

你可能感兴趣的文章
集中管理系统--puppet
查看>>
分布式事务最终一致性常用方案
查看>>
Exchange 2013 PowerShell配置文件
查看>>
JavaAPI详解系列(1):String类(1)
查看>>
HTML条件注释判断IE<!--[if IE]><!--[if lt IE 9]>
查看>>
发布和逸出-构造过程中使this引用逸出
查看>>
Oracle执行计划发生过变化的SQL语句脚本
查看>>
使用SanLock建立简单的HA服务
查看>>
发现一个叫阿尔法城的小站(以后此贴为我记录日常常用网址的帖子了)
查看>>
Subversion使用Redmine帐户验证简单应用、高级应用以及优化
查看>>
Javascript Ajax 异步请求
查看>>
DBCP连接池
查看>>
cannot run programing "db2"
查看>>
mysql做主从relay-log问题
查看>>
Docker镜像与容器命令
查看>>
批量删除oracle中以相同类型字母开头的表
查看>>
Java基础学习总结(4)——对象转型
查看>>
BZOJ3239Discrete Logging——BSGS
查看>>
SpringMVC权限管理
查看>>
spring 整合 redis 配置
查看>>