【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 }
本文作者:xrdog
作者博客:http://www.cnblogs.com/Dragon-Light/
转载请注明出处,侵权必究,保留最终解释权!