标签:cin 开始 int class 不能 浮点 namespace log clu
由于提交关闭了所以我也不知道能不能A,样例能过...
描述
给定如下表达式:
A0O1A1O2A2O3A3… OnAn
其中Ai(0<=i<=n)代表操作数,Oi(1<=i<=n)代表算子。有三类算子包括‘&’、‘|’和‘^’,这些算子拥有相同的计算优先级。每个算子Oi以及它后面相邻的操作数Ai,他们可能一起消失,消失的概率为Pi(注意为保证计算精度须使用double型数据)。
例如,对于样例输入中的第一组测试数据期望计算方法为:
(P1*P2)*A0+(1-P1)*(P2)*(A0O1 A1)+(P1)*(1-P2)*(A0O2A2)+(1-P1)*(1-P2)*( A0O1A1O2A2)=0.1*0.2*1+0.9*0.2*(1^2)+0.1*0.8*(1^3)+0.9*0.8*(1^2^3)=0.72
输入
输入包含若干测试样例。
对于每组测试样例,第一行为正整数n ( 0 < n <= 200 )
第二行包含n+1个正整数代表操作数集合{A}(其中Ai小于2^20),
第三行包含n个算子代表操作算子集合{O},第四行包含n个浮点数代表概率集合{P}(其中0 <= Pi <= 1)。输出对于每组测试样例,第一行输出测试样例序号(从1开始)。然后,输出期望值,近似到小数点后6位。
样例输入
2 1 2 3 ^ ^ 0.1 0.2 2 8 9 10 ^ ^ 0.5 0.78 1 1 2 & 0.5
样例输出
Case 1: 0.720000 Case 2: 4.940000 Case 3: 0.500000
1 #include<iostream> 2 using namespace std; 3 int n,a[201],s; 4 double ans,p[201]; 5 char o[201]; 6 double f(int pos,double pre,int u) //当前开始的位置pos,之前得到的数pre和之前表达式的值u 7 { 8 double t,s=0; 9 int v; 10 if(pos==n+1) return 0; 11 for(int i=pos;i<=n;i++) 12 { 13 t=pre/u; 14 t=t/p[i]-t; 15 //cout<<t<<‘ ‘; 16 switch(o[i]) 17 { 18 case ‘&‘:v=u&a[i];break; 19 case ‘|‘:v=u|a[i];break; 20 case ‘^‘:v=u^a[i];break; 21 } 22 t*=v; //算出当前得到的数 23 // cout<<v<<endl; 24 s+=t+f(i+1,t,v); 25 } 26 return s; 27 } 28 int main() 29 { 30 int kase=0; 31 while(cin>>n) 32 { 33 ans=1; 34 for(int i=0;i<=n;i++) cin>>a[i]; 35 for(int i=1;i<=n;i++) cin>>o[i]; 36 for(int i=1;i<=n;i++) cin>>p[i]; 37 38 for(int i=1;i<=n;i++) //当所有操作符都消失 39 ans*=p[i]; 40 ans*=a[0]; 41 ans+=f(1,ans,a[0]); 42 printf("Case %d:\n%.6llf\n",++kase,ans); 43 } 44 }
标签:cin 开始 int class 不能 浮点 namespace log clu
原文地址:http://www.cnblogs.com/sulley/p/7774084.html