题意:给4个骰子,每面染有红色或者蓝色,概率相等,然后告诉你前两次扔后红色面朝上的骰子各有几个,问你再扔一次红色面朝上概率是多大
题解:对于推不出公式的童鞋就只好爆搜了,但是,条件概率公式还是要知道才行,即P(A|B)=P(B|A)*P(A)/P(B),通过这个,单独看每一个骰子,可以求出当掷出骰子状态为00,01,10,11时骰子6面为t时的概率。
接着,就是4^4枚举每个骰子状态*7^4枚举每个骰子染色状况*2^4计算期望,然后,还100MS+给过了
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cmath> 5 using namespace std; 6 const double eps=1e-10; 7 double C6[7]= {1.0,6.0,15.0,20.0,15.0,6.0,1.0}; 8 double PT[7],PXT[4][7],PTX[7][4],PX[4]; 9 double ans,num; 10 void cal(int t1,int t2,int t3,int t4,double pp) 11 { 12 double p1,p2,p3,p4; 13 for(int n1=0; n1<2; n1++) 14 { 15 if(t1<n1||(n1==0&&t1==6)) 16 continue; 17 p1=(n1==0)?(6-t1)/6.0:t1/6.0; 18 for(int n2=0; n2<2; n2++) 19 { 20 if(t2<n2||(n2==0&&t2==6)) 21 continue; 22 p2=(n2==0)?(6-t2)/6.0:t2/6.0; 23 for(int n3=0; n3<2; n3++) 24 { 25 if(t3<n3||(n3==0&&t3==6)) 26 continue; 27 p3=(n3==0)?(6-t3)/6.0:t3/6.0; 28 for(int n4=0; n4<2; n4++) 29 { 30 if(t4<n4||(n4==0&&t4==6)) 31 continue; 32 p4=(n4==0)?(6-t4)/6.0:t4/6.0; 33 double p=p1*p2*p3*p4*pp; 34 num+=p; 35 ans+=(n1+n2+n3+n4)*p; 36 } 37 } 38 } 39 } 40 } 41 int main() 42 { 43 for(int t=0; t<7; t++) 44 PT[t]=C6[t]/64.0; 45 memset(PX,0,sizeof(PX)); 46 memset(PXT,0,sizeof(PXT)); 47 memset(PTX,0,sizeof(PTX)); 48 for(int t=0; t<7; t++) 49 { 50 for(int x=0; x<4; x++) 51 { 52 int a=x%2,b=(x>>1)%2; 53 PXT[x][t]=((a==0)?(6-t)/6.0:t/6.0)*((b==0)?(6-t)/6.0:t/6.0); 54 PX[x]+=PXT[x][t]; 55 } 56 } 57 for(int t=0; t<7; t++) 58 { 59 for(int x=0; x<4; x++) 60 { 61 PTX[t][x]=PXT[x][t]*PT[t]/PX[x]; 62 } 63 } 64 int T; 65 for(scanf("%d",&T); T; T--) 66 { 67 int a,b; 68 scanf("%d%d",&a,&b); 69 ans=0.0; 70 num=0.0; 71 for(int x1=0; x1<4; x1++) 72 { 73 for(int x2=0; x2<4; x2++) 74 { 75 for(int x3=0; x3<4; x3++) 76 { 77 for(int x4=0; x4<4; x4++) 78 { 79 int aa=x1%2+x2%2+x3%2+x4%2; 80 int bb=x1/2%2+x2/2%2+x3/2%2+x4/2%2; 81 if(aa==a&&bb==b) 82 { 83 for(int t1=0; t1<7; t1++) 84 { 85 if(PTX[t1][x1]>eps) 86 for(int t2=0; t2<7; t2++) 87 { 88 if(PTX[t2][x2]>eps) 89 for(int t3=0; t3<7; t3++) 90 { 91 if(PTX[t3][x3]>eps) 92 for(int t4=0; t4<7; t4++) 93 { 94 if(PTX[t4][x4]>eps) 95 { 96 cal(t1,t2,t3,t4,PTX[t1][x1]*PTX[t2][x2]*PTX[t3][x3]*PTX[t4][x4]); 97 } 98 } 99 } 100 } 101 } 102 } 103 } 104 } 105 } 106 } 107 printf("%.3lf\n",ans/num); 108 } 109 return 0; 110 }