zoukankan      html  css  js  c++  java
  • poj 3744 Scout YYF I

    题意:

    有 n个雷,分别在 a[0]...a[n-1] ,走一步概率为 p ,走两步概率为 1-p ,初始位置为1,问安全到达终点的概率。

    因为位置范围比较大【1, 100000000】,所以可以把 相邻的两个地雷之间的概率用矩阵快速幂计算

    [ a(i) a(i+1) ]  *| 0 1-p |=[ a(i+1) a(i+2)]

              | 1   p  |

     1 #include<iostream>
     2 #include<string.h>
     3 #include<algorithm>
     4 #include<stdio.h>
     5 using namespace std;
     6 __int64 t,n,i,j,pos[15],pp;
     7 double k,p;
     8 struct matrix
     9 {
    10     double arr[15][15];
    11 } p1,p2,p3;
    12 matrix add(matrix a,matrix b)//矩阵乘法
    13 {
    14     matrix tmp;
    15     memset(tmp.arr,0,sizeof(tmp.arr));
    16     for(i=0; i<2; i++)
    17         for(j=0; j<2; j++){
    18             for(int k=0; k<2; k++)
    19                 tmp.arr[i][j]+=a.arr[i][k]*b.arr[k][j];
    20         }
    21     return tmp;
    22 }
    23 
    24 matrix fast(matrix a,int n,matrix b)//矩阵快速幂
    25 {
    26     while(n>=1)
    27     {
    28         if((n&1)!=0)
    29         {
    30             b=add(a,b);
    31         }
    32         a=add(a,a);
    33         n/=2;
    34     }
    35     return b;
    36 }
    37 void init(){
    38         p1.arr[0][0]=0,p1.arr[0][1]=1-p,p1.arr[1][0]=1,p1.arr[1][1]=p;
    39         memset(p2.arr,0,sizeof(p2.arr));
    40         for(int i=0; i<2; i++)
    41                 p2.arr[i][i]=1;
    42 }
    43 int main()
    44 {
    45     while(cin>>n>>p)
    46     {
    47         for(int i=0;i<n;i++) scanf("%d",&pos[i]);
    48         sort(pos,pos+n);
    49         double ans1=1,ans2;
    50         if(pos[0]==1){
    51             printf("%.7f
    ",0);
    52             continue;
    53         }
    54         if(pos[0]==2)
    55             ans2=0;
    56         else
    57             ans2=p;   
    58         //初始化第一个位子概率为1,即ans1=1,第二个位置概率要看第一个地雷的位置pos[0],如果pos[0]=2,则ans2=0,否则ans2=p;
    59         for(int i=0;i<n;i++){
    60             int cnt;
    61             if(i==0) cnt=pos[0]-2;
    62             else cnt=pos[i]-pos[i-1];
    63             if(cnt==0) continue;
    64             init();
    65             p3=fast(p1,cnt,p2);
    66             double t1,t2;
    67             t1=ans1*p3.arr[0][0]+ans2*p3.arr[1][0];
    68             t2=ans1*p3.arr[0][1]+ans2*p3.arr[1][1];
    69             ans1=t1,ans2=0;
    70         }
    71         printf("%.7f
    ",ans1*(1-p));
    72     }
    73 }
  • 相关阅读:
    01-NoSQL概述
    SSM快速整合
    C语言指针传参与C++引用传参,以及尾插法建立单链表使用到的引用
    IP地址相关
    二叉树的先序遍历、中序遍历、后序遍历-C语言描述
    华为5G认证练习题2
    华为5G认证练习题
    华为ICT学堂获取练习题及答案
    C++ cin对象的一些方法
    webpack学习笔记2:新建工程
  • 原文地址:https://www.cnblogs.com/ainixu1314/p/3880233.html
Copyright © 2011-2022 走看看