您的位置:首页 > 其它

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

2017-04-02 10:34 274 查看
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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: