HDU 4649

来源:互联网 发布:apache ab 多个url 编辑:程序博客网 时间:2024/05/29 07:48

题目中有个很重要的条件 ,Ai will be less than 220,所以把每一个数转化成二进制来算不会超过20位

分别对每一位进行运算,算出每一位上最终结果为1 的概率,再乘上该位二进制对应的十进制数,得最终得到1的概率,即为期望





#include <iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<queue>#include<vector>#include<set>#include<map>#include<string>#define N 205using namespace std;char c[N];int num[N];double p[N];double P;double ans;int main(){    int n,i,j,icase=0;    while(scanf("%d",&n)!=EOF)    {        icase++;        ans=0;        for(i=0;i<=n;i++)        scanf("%d",&num[i]);        getchar();        for(i=1;i<=n;i++)        {            scanf("%c",&c[i]);            getchar();        }        for(i=1;i<=n;i++)        scanf("%lf",&p[i]);        for(i=0;i<=20;i++)        {            if(num[0]&(1<<i))  //a[0]二进制的第i位上为1            P=1;    //  P为当前位等于1的概率            else            P=0;            for(j=1;j<=n;j++)  //对每一个数的第i位进行处理            {                if(num[j]&(1<<i))                {                    if(c[j]=='&')                    continue;                    else if(c[j]=='^')                    P=P*p[j]+(1-P)*(1-p[j]);  //异或为1,之前为1&&异或运算不存在||之前为0,异或1                    else                    P=P+(1-P)*(1-p[j]);                 }                        else                {                    if(c[j]=='&')                    P=P*p[j];                    else                    continue;                }            }          // cout<<P<<endl;            ans+=P*(1<<i);        }        printf("Case %d:\n",icase);        printf("%.6lf\n",ans);    }    return 0;}


原创粉丝点击