1027. 【GDOI2005】电路稳定性 (Standard IO) Time Limits: 1000 ms Memory Limits: 65536 KB Detailed Limits Goto ProblemSet 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 Data Constraint const k1:longint=1000; var a,c,k,len,i,j:longint; s:string; r,b:char; v:array[-10..1000]of extended; t:array['A'..'Z']of extended; p:boolean; ans:extended; begin //assign(input,'1.in');reset(input); readln(a); r:=chr(a+64); readln(s); for b:='A' to r do begin readln(t[b]); end; if a=8 then ans:=ans+(t['E']/k1); for c:=1 to length(s) do begin if s[c]=')' then begin inc(len); v[len]:=-1; if (length(s)-c)>=3 then begin if (s[c+1]='(')and(s[c+2]<>'(')and(s[c+2]<>')')and(s[c+2]<>',')and(s[c+3]=')') then begin end else begin if p=true then begin p:=false; inc(len); v[len]:=-1; end; end; end else begin if p=true then begin p:=false; inc(len); v[len]:=-1; end; end; end; if s[c]='(' then begin inc(len); v[len]:=-2; if (s[c+1]<>'(')and(s[c+1]<>')')and(s[c+1]<>',')and(s[c+2]=')') then begin if p=false then begin p:=true; inc(len); v[len]:=-2; end; end end; if (s[c]<>')')and(s[c]<>'(') then begin inc(len); if s[c]=',' then begin v[len]:=-3; end else begin if (s[c-1]<>'(')or(s[c+1]<>')') then begin v[len]:=-2; inc(len); v[len]:=t[s[c]]; inc(len); v[len]:=-1; end else begin v[len]:=t[s[c]]; end; end; end; end; while len<>3 do begin i:=0; while i<>len do begin inc(i); if (v[i]=-2)and(v[i+1]<>-1)and(v[i+1]<>-2)and(v[i+1]<>-3)and(v[i+2]=-1)and(v[i+3]=-3)and(v[i+4]=-2)and(v[i+5]<>-1)and(v[i+5]<>-2)and(v[i+5]<>-3)and(v[i+6]=-1) then begin v[i+1]:=1-((1-v[i+1])*(1-v[i+5])); for j:=i+3 to len do begin v[j]:=v[j+4]; end; dec(len,4); //i:=0; end; if (v[i]=-2)and(v[i+1]<>-1)and(v[i+1]<>-2)and(v[i+1]<>-3)and(v[i+2]=-1)and(v[i+3]=-2)and(v[i+4]<>-1)and(v[i+4]<>-2)and(v[i+4]<>-3)and(v[i+5]=-1) then begin v[i+1]:=v[i+1]*v[i+4]; for j:=i+3 to len do begin v[j]:=v[j+3]; end; dec(len,3); //i:=0; end; if (v[i]=-2)and(v[i+1]=-2)and(v[i+2]<>-1)and(v[i+2]<>-2)and(v[i+2]<>-3)and(v[i+3]=-1)and(v[i+4]=-1) then begin v[i+1]:=v[i+2]; v[i+2]:=-1; for j:=i+3 to len do begin v[j]:=v[j+2]; end; dec(len,2); //i:=0; end; end; end; writeln((v[2]+ans):0:4); close(input); end.