高中1027

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.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值