JZOJ 4.1 C组 【GDOI2005】电路稳定性

来源:互联网 发布:数据统计专业 编辑:程序博客网 时间:2024/06/05 00:25

Description

  你有一个电路,电路上有n个元件。已知元件i损坏而断开的概率是Pi(i=1,2….n,0<=pi<=1)。
  请你算出整个电路断路的概率。
  元件的连接方式很简单,对电路的表示:
  1. 一个元件是最小的电路,用A表示元件1,B表示元件2,如此类推。
  2. K个电路组成的串联电路表示为:电路1,电路2,。。。。,电路K。
  3. K个电路组成的并联电路表示为:(电路1)(电路2)。。。(电路K)。

Input

  第一行是一个整数n(1<=n<=26),表示一共有多少个元件,第二行是表示电路的字符串,最后是n行,每行是一个实数Pi(i=1,2,…,n,0<=Pi<=1),表示该元件断路的概率。

Output

  输出一个实数,表示整个电路断路的概率,精确到小数点后4位。

Sample Input

5
(A,B)((C)(D),E)
0.2
0.3
0.4
0.5
0.6

Sample Output

0.2992


求串联断电的公式为1-(1-x)*(1-y)
并联为x*y
有了这两个公式,就可以开始我们神奇而漫长的模拟之旅了
一个for先枚举他的长度,
如果为字母则将这个字母替换为实数;
如果搜到了右括号,将向前枚举左括号:如果搜到了逗号,就将串联的断电的概率求出来。
最后在将枚举到的左括号的前后两个的并联的断电概率求出来。


代码如下:

var        c:char;s:ansistring;        a:array[1..26]of real;        num:array[0..1000]of real;        z,q:array[0..1000]of longint;        p:array[0..1000]of char;        i,j,k,v,l,n,m,len:longint;        ans,x,y:real;procedure main;begin  for i:=1 to l do    begin      c:=s[i];      if ('A'<=c)and('Z'>=c) then        begin          k:=ord(c)-64;          inc(m);          num[m]:=a[k];          z[m]:=i;        end      else        if (c=')') then          begin            while (p[len]<>'(') do              begin                if (p[len]=',') then                  begin                    x:=num[m];                    dec(m);                    y:=num[m];                    num[m]:=1-(1-x)*(1-y);                    dec(len);                  end;              end;              dec(len);              if (z[m-1]>q[len]) then                begin                  x:=num[m];dec(m);                  y:=num[m];                  num[m]:=x*y;                end;          end        else          begin            inc(len);            p[len]:=c;            q[len]:=i;          end;    end;end;procedure init;begin  readln(n);  readln(s);  for i:=1 to n do read(a[i]);  s:='('+s+')';  l:=length(s);  len:=0;  m:=0;end;begin  init;  main;  writeln(num[m]:0:4);end.
2 0