题意:在一条不满地雷的路上,你现在的起点在1处。在N个点处布有地雷,1<=N<=10。地雷点的坐标范围:[1,100000000].
每次前进p的概率前进一步,1-p的概率前进1-p步。问顺利通过这条路的概率。就是不要走到有地雷的地方。
 
设dp[i]表示到达i点的概率,则 初始值 dp[1]=1.
很容易想到转移方程: dp[i]=p*dp[i-1]+(1-p)*dp[i-2];
但是由于坐标的范围很大,直接这样求是不行的,而且当中的某些点还存在地雷。
 
N个有地雷的点的坐标为 x[1],x[2],x[3]```````x[N].
我们把道路分成N段:
1~x[1];
x[1]+1~x[2];
x[2]+1~x[3];
`
`
`
x[N-1]+1~x[N].
 
这样每一段只有一个地雷。我们只要求得通过每一段的概率。乘法原理相乘就是答案。
对于每一段,通过该段的概率等于1-踩到该段终点的地雷的概率。
 
就比如第一段 1~x[1].  通过该段其实就相当于是到达x[1]+1点。那么p[x[1]+1]=1-p[x[1]].
但是这个前提是p[1]=1,即起点的概率等于1.对于后面的段我们也是一样的假设,这样就乘起来就是答案了。
 
对于每一段的概率的求法可以通过矩阵乘法快速求出来。

 /*
POJ 3744 C++ 0ms 184K
*/
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<math.h>
using namespace std; struct Matrix
{
double mat[][];
};
Matrix mul(Matrix a,Matrix b)
{
Matrix ret;
for(int i=;i<;i++)
for(int j=;j<;j++)
{
ret.mat[i][j]=;
for(int k=;k<;k++)
ret.mat[i][j]+=a.mat[i][k]*b.mat[k][j];
}
return ret;
}
Matrix pow_M(Matrix a,int n)
{
Matrix ret;
memset(ret.mat,,sizeof(ret.mat));
for(int i=;i<;i++)ret.mat[i][i]=;
Matrix temp=a;
while(n)
{
if(n&)ret=mul(ret,temp);
temp=mul(temp,temp);
n>>=;
}
return ret;
} int x[];
int main()
{
int n;
double p;
while(scanf("%d%lf",&n,&p)!=EOF)//POJ上G++要改为cin输入
{
for(int i=;i<n;i++) scanf("%d",&x[i]);
sort(x,x+n);
double ans=;
Matrix tt;
tt.mat[][]=p;
tt.mat[][]=-p;
tt.mat[][]=;
tt.mat[][]=;
Matrix temp; temp=pow_M(tt,x[]-);
ans*=(-temp.mat[][]); for(int i=;i<n;i++){
if(x[i]==x[i-])continue;
temp=pow_M(tt,x[i]-x[i-]-);
ans*=(-temp.mat[][]);
}
printf("%.7lf\n",ans);//POJ上G++要改为%.7f
}
return ;
}

最新文章

  1. 体验 ASP.NET Core 1.1 中预编译 MVC Razor 视图
  2. android性能测试与调优:使用 DDMS 查看内存分配情况
  3. Ansible-Tower快速入门-6.查看tower的仪表板【翻译】
  4. &lt;&lt;软技能,代码之外的生存技能&gt;&gt;读书笔记
  5. cefglue埋坑记录
  6. ecshop的商品系统数据库整合
  7. shell运算
  8. 自定义Encoder/Decoder进行对象传递
  9. centos7 学习1 KDE配置中文
  10. Write operations are not allowed in read-only mode (FlushMode.NEVER/
  11. Bootstrap_CSS全局样式
  12. Yii框架tips(转)
  13. file_get_contents 超时设置
  14. NET Core 构成体系
  15. java操作mongodb——更新数据
  16. 字符串---分割成数组(str_split ),算出一个字符串中出现最多的字符, 学校中最多的姓名
  17. Python学习笔记010_迭代器_生成器
  18. asp中日志方法
  19. 将studio项目 转换为eclipse项目
  20. Shell-7--环境变量配置文件

热门文章

  1. [Python]find_all函数 2020.2.7
  2. yolov3 进化之路,pytorch运行yolov3,conda安装cv2,或者conda安装找不到包问题
  3. 《NVM-Express-1_4-2019.06.10-Ratified》学习笔记(5.21.1.10-加-6.4)Atomic_Operations
  4. MySQL8.0.11解压版安装详细教程
  5. linux - mysql:启动 mysql
  6. RN开发-Android原生交互
  7. 关于wget安装mysql的过程
  8. C++-POJ2777-Count Color[线段树][lazy标记][区间修改]
  9. 《深入理解Java虚拟机》读书笔记十二
  10. Python 排序---sort与sorted学习(这是摘录别人的资源总结,自己可临摹学习)