poj3744

来源:互联网 发布:js 取前几个字符 编辑:程序博客网 时间:2024/05/20 04:28

【题意】

侦察兵YYF要通过一条布有地雷的路,他从1出发,每次有p的几率前进1格,1-p的几率前进两个,现已知所有地雷的位置,求YYF不踩中地雷的几率

【输入】

多组数据

每组数据第一行n、p

接下来一行n个数字表示地雷的位置

【输出】

YYF不踩中雷的几率


f[i]表示在没有地雷的情况下,走i距离的几率

可得f[i]=f[i-1]*p+f[i-2]*(1-p)

类似斐波那契的一个公式

构造一个矩阵

  p   1

1-p 0

这个矩阵的i次方的(1,1)既是f[i]

然后按雷划分一下阶段即可


program poj3744;type  square=array [1..2,1..2] of double;var  n,i,j,k:longint;  ans,p:double;  mine:array [0..11] of longint;  sol,root:square;procedure swap (var a,b:longint);inline;var  i:longint;begin  i:=a;  a:=b;  b:=i;end;procedure qsort (s,e:longint);var  i,j,k:longint;begin  if s>=e then exit;  i:=s;  j:=e;  k:=mine[(s+e) div 2];  while i<=j do    begin      while mine[i]<k do inc(i);      while mine[j]>k do dec(j);      if i>j then break;      swap(mine[i],mine[j]);      inc(i);      dec(j);    end;  qsort(s,j);  qsort(i,e);end;function matrixmul (a,b:square):square;var  ans:square;  i,j,k:longint;begin  fillchar(ans,sizeof(ans),0);  for i:=1 to 2 do    for j:=1 to 2 do      for k:=1 to 2 do        ans[i,j]:=ans[i,j]+a[i,k]*b[k,j];  exit(ans);end;function power (m:longint):square;var  ans,now:square;begin  ans[1,1]:=1;  ans[1,2]:=0;  ans[2,1]:=0;  ans[2,2]:=1;  now:=root;  while m<>0 do    begin      if m and 1 = 1 then ans:=matrixmul(ans,now);      m:=m div 2;      now:=matrixmul(now,now);    end;  exit(ans);end;begin  while not seekeof do    begin      read(n,p);      for i:=1 to n do        read(mine[i]);      qsort(1,n);      mine[0]:=0;      root[1,1]:=p;      root[1,2]:=1;      root[2,1]:=1-p;      root[2,2]:=0;      ans:=1;      for i:=1 to n do        if mine[i-1]+1=mine[i] then          begin            ans:=0;            break;          end                               else          begin            sol:=power(mine[i]-(mine[i-1]+1));            ans:=ans*(1-sol[1,1]);          end;      writeln(abs(ans):0:7);    end;end.


原创粉丝点击