现在的位置: 首页 > 综合 > 正文

poj3744

2018年01月15日 ⁄ 综合 ⁄ 共 1369字 ⁄ 字号 评论关闭

【题意】

侦察兵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.
【上篇】
【下篇】

抱歉!评论已关闭.