【BZOJ】4008: [HNOI2015]亚瑟王

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4008


 

这题主要在于:先算概率,再算期望!

一轮一轮的计算似乎很复杂,每一轮它其实是可以看作一次机会

考虑${f[i][j]}$表示已经按照顺序考虑完了第$i$张卡牌,第$i$个人得到了第$j$次机会的概率。

那么${ans=\sum_{i=1}^{n}\sum_{j=1}^{r}f[i][j]*(1-(1-p_i)^{j})*d_i}$//表示$i$利用到了机会。

${f[i][j]=f[i-1][j]*(1-p_{i-1})^{j}+f[i-1][j+1]*(1-(1-p_{i-1})^{j+1})}$//分别表示$i-1$利用了一个机会,$i-1$没有利用到机会。


 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<vector>
 5 #include<cstdlib>
 6 #include<cmath>
 7 #include<cstring>
 8 using namespace std;
 9 #define maxn 1010
10 #define llg long long 
11 #define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
12 llg n,m,a[maxn],T,r;
13 double f[maxn][maxn],ans,p[maxn],mi[maxn][maxn];
14 void init()
15 {
16     scanf("%lld%lld",&n,&r);
17     for (llg i=1;i<=n;i++)
18     {
19         scanf("%lf %lld",&p[i],&a[i]);
20         mi[i][1]=1-p[i];
21         for (llg j=2;j<=r+1;j++) mi[i][j]=mi[i][j-1]*(1-p[i]);
22     }
23     for (llg i=0;i<=max(r,n);i++) f[0][i]=f[i][r+1]=0;
24     f[0][r]=1;
25     ans=0;
26 }
27 
28 int main()
29 {
30     yyj("king");
31     cin>>T;
32     for (llg i=0;i<maxn;i++) mi[i][0]=mi[0][i]=1;
33     while (T--)
34     {
35         init();
36         for (llg i=1;i<=n;i++)
37             for (llg j=0;j<=r;j++)
38             {
39                 f[i][j]=f[i-1][j]*mi[i][j]+f[i-1][j+1]*(1-mi[i][j+1]);
40                 ans+=f[i-1][j+1]*(1-mi[i][j+1])*a[i];
41             }
42         printf("%.10lf\n",ans);
43     }
44     return 0;
45 }

 

posted @ 2017-02-13 19:35  №〓→龙光←  阅读(219)  评论(0编辑  收藏  举报