HDU 4649 Professor Tian

点击打开链接

这题递推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;
}


 

你可能感兴趣的:(HDU 4649 Professor Tian)