HDU 4649 Professor Tian

来源:互联网 发布:复制信息打开淘宝 编辑:程序博客网 时间:2024/06/06 09:21

点击打开链接

这题递推ans[20]记录每一位1出现的概率

全部加起来即可

有的数字二进制虽然没有20位

但必须要判断到20位

WA了好多次

还好双德大神指出这个错误

http://blog.csdn.net/shuangde800/article/details/9816479这是他的题解

 

 

#include <cstdio>#include <algorithm>#include <iostream>using namespace std;double ans[23];char val[220];double p[220];int arr[220];void fuck(int num,char val,double p){    int hehe;    double p1;    for(int idx=1;idx<=20;idx++){        hehe=(num>>(idx-1))&1;        p1=ans[idx];        switch(val){        case '|':{            if(hehe==1) p1=1;                 }break;        case '&':{            if(hehe==0) p1=0;                 }break;        case '^':{            if(hehe==1) p1=1-ans[idx];                 }break;        }        ans[idx]=p1*p+(1-p)*ans[idx];    }}int main(){    int n,cas=1;    while(scanf("%d%*c",&n)!=EOF){        memset(ans,0,sizeof ans);        scanf("%d%*c",&arr[0]);        val[0]='|';        p[0]=0;        for(int i=1;i<=n;i++) scanf("%d%*c",&arr[i]);        for(int i=1;i<=n;i++) scanf("%c%*c",&val[i]);        for(int i=1;i<=n;i++) scanf("%lf%*c",&p[i]);        for(int i=0;i<=n;i++){            fuck(arr[i],val[i],1-p[i]);        }        double out=0;        for(int i=1;i<=20;i++)            out+=(1<<(i-1))*ans[i];        printf("Case %d:\n%.6lf\n",cas++,out);    }    return 0;}