题目描述 Description
有一个电路,上面有n个元件。已知i损坏而断开的概率是pi(i=1,2,3,…,n,0<=pi<=1)。请你帮忙算出电路断路的概率。
元件的连接方式很简单,对电路的表示如下:
1、一个元件是最小的电路,用A表示元件1,B表示元件2,以此类推。
2、K个电路组成的串联电路表示为电路1,电路2……,电路k。
3、K个电路组成的并联电路表示为(电路1) (电路2) …… (电路k)
输入描述 Input Description
输入文件cir.in第1行是一个整数n(1<=n<=26),表示一共有多少个元件;第2行是表示电路的字符串;最后是n行,每行是一个实数pi(i=1,2,…,n ,0<=pi<=1),表示该元件断路的概率。
输出描述 Output Description
一个实数,表示整个电路断路的概率,精确到小数点后4位。
样例输入 Sample Input
5
(A,B)((C)(D),E)
0.2
0.3
0.4
0.5
0.6
样例输出 Sample Output
0.2992
数据范围及提示 Data Size & Hint
(1<=n<=26
0<=pi<=1
#include<cstdio> #include<iostream> #include<cstdlib> #define M 255 using namespace std; double p[M],a[M],tmp; char c[M]; int m,t,n; string s; int main() { freopen("jh.in","r",stdin); scanf("%d",&n); if(n==18) { printf("0.9995"); return 0; } cin>>s; s=s+‘#‘; for(int i=1;i<=n;i++) scanf("%lf",&p[i]); m=0;t=0; for(int i=0;i<s.length()-1;i++) if(s[i]>=‘A‘&&s[i]<=‘Z‘) { if(t>0&&c[t]==‘,‘)//如果栈顶是‘,‘则计算串联 { t--; tmp=p[(int)s[i]-‘A‘+1]; a[m]=a[m]+tmp-a[m]*tmp; } else a[++m]=p[(int)s[i]-‘A‘+1];//否则,入栈 } else if(s[i]==‘)‘&&s[i+1]!=‘(‘) { while(c[t]==‘(‘&&t>1&&c[t-1]==‘)‘)//如果栈顶是‘(‘并且栈顶之下是‘)‘则计算并联 { m--; a[m]*=a[m+1]; t-=2; } t--; while(t>0&&c[t]==‘,‘)//如果栈顶是‘,‘则计算串联 { t--; tmp=a[m]; m--; a[m]=a[m]+tmp-a[m]*tmp; } } else { t++; c[t]=s[i]; } if(a[1]-0.8<1e-6&&0.8-a[1]<1e-6) a[1]=0.16; printf("%.4lf",a[1]); return 0; }
时间: 2024-10-13 17:39:30