M_sea

洛谷3239 [HNOI2015]亚瑟王
LuoguBZOJ分析设$g[i]$表示第$i$张卡被打出的概率,然后答案变为$\sum\limits_{i=1}...
扫描右侧二维码阅读全文
09
2019/01

洛谷3239 [HNOI2015]亚瑟王

Luogu

BZOJ

分析

设$g[i]$表示第$i$张卡被打出的概率,然后答案变为$\sum\limits_{i=1}^ng[i]\times d[i]$。

考虑这个$g$怎么求。

设$f[i][j]$表示$r$轮中,前$i$张卡出了$j$张的概率,则有:

$\large g[i]=\sum\limits_{j=0}^{\min\{i-1,r\}}\Big[1-(1-p[i])^{r-j}\Big]\times f[i-1][j]$。

最后考虑$f$怎么求。分发动和不发动两种情况考虑,可以得到:

$f[i][j]=[j>0]\times\Big[1-(1-p[i])^{r-j+1}\Big]f[i-1][j-1]+[i\neq j]\times(1-p[i])^{r-j}f[i-1][j]$。

边界:$f[1][0]=p[1]^r,f[1][1]=1-p[1]^r,g[1]=1-p[1]^r$。

注意每次数组要清$0$。可以预处理出$pw[i][j]=p[i]^j$。

代码

//It is made by M_sea
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#define re register
using namespace std;

inline int read() {
    int X=0,w=1; char c=getchar();
    while (c<'0'||c>'9') { if (c=='-') w=-1; c=getchar(); }
    while (c>='0'&&c<='9') X=X*10+c-'0',c=getchar();
    return X*w;
}

const int MAXN=220+10;
const int MAXR=132+10;

int n,r;
double p[MAXN];
int d[MAXN];
double pw[MAXN][MAXR];
double f[MAXN][MAXN],g[MAXN];

int main() {
    int T=read();
    while (T--) {
        memset(f,0,sizeof(f)); memset(g,0,sizeof(g));
        n=read(),r=read();
        for (re int i=1;i<=n;++i) scanf("%lf",&p[i]),d[i]=read();
        for (re int i=1;i<=n;++i) { //预处理(1-p[i])^n
            pw[i][0]=1;
            for (re int j=1;j<=r;++j)
                pw[i][j]=pw[i][j-1]*(1-p[i]);
        }
        f[1][0]=pw[1][r],f[1][1]=g[1]=1-pw[1][r];
        for (re int i=2;i<=n;++i)
            for (re int j=0;j<=min(i,r);++j) {
                if (j) f[i][j]+=(1-pw[i][r-j+1])*f[i-1][j-1];
                if (i!=j) f[i][j]+=pw[i][r-j]*f[i-1][j];
            }
        for (re int i=2;i<=n;++i)
            for (re int j=0;j<=min(i-1,r);++j)
                g[i]+=(1-pw[i][r-j])*f[i-1][j];
        double ans=0;
        for (re int i=1;i<=n;++i) ans+=g[i]*d[i];
        printf("%.10lf\n",ans);
    }
    return 0;
}
最后修改:2019 年 01 月 09 日 05 : 16 PM

1 条评论

  1. smy

    好神啊,做题做这么快

发表评论