题目大意:
有三个骰子,分别有k1,k2,k3个面。
每次掷骰子,如果三个面分别为a,b,c则分数置0,否则加上三个骰子的分数之和。
当分数大于n时结束。求游戏的期望步数。初始分数为0
分析
1 #include<cstdio>
2 #include<cstring>
3 #include<iostream>
4 using namespace std;
5 int main()
6 {
7 int t,n,k1,k2,k3,a,b,c;
8 scanf("%d",&t);
9 while(t--)
10 {
11 scanf("%d %d %d %d %d %d %d",&n,&k1,&k2,&k3,&a,&b,&c);
12 int sum=k1+k2+k3;
13 double pp=1.0/(k1*k2*k3);
14 double p[10000];
15 memset(p,0,sizeof(p));
16 for(int i=1; i<=k1; i++)
17 {
18 for(int j=1; j<=k2; j++)
19 {
20 for(int k=1; k<=k3; k++)
21 if(i!=a||j!=b||k!=c)
22 p[i+j+k]+=pp;
23 }
24
25 }
26 double a[1000]= {0},b[1000]= {0};
27 for(int i=n; i>=0; i--)
28 {
29 for(int k=3; k<=sum; k++)
30 {
31 a[i]+=a[i+k]*p[k];
32 b[i]+=b[i+k]*p[k];
33 }
34 a[i]+=pp;
35 b[i]+=1;
36 }
37 printf("%.15lf
",b[0]/(1-a[0]));
38 }
39 return 0;
40 }